blob: f6e999f29985d99f347e29b2f3259f8117f61132 [file] [log] [blame]
//===-------------- ctthread.cc - Mvm common threads ----------------------===//
//
// Mvm
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mvm/Threads/Key.h"
#include "mvm/Threads/Thread.h"
#include <pthread.h>
#include <signal.h>
#include <time.h>
using namespace mvm;
void Thread::yield() {
sched_yield();
}
int Thread::self() {
return (int)pthread_self();
}
void Thread::yield(unsigned int *c) {
if(++(*c) & 3)
sched_yield();
else {
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 2000;
nanosleep(&ts, 0);
}
}
int Thread::kill(int tid, int signo) {
return pthread_kill((pthread_t)tid, signo);
}
void Thread::exit(int value) {
pthread_exit((void*)value);
}
void* ThreadKey::get() {
pthread_key_t k = (pthread_key_t)val;
return (void *)pthread_getspecific(k);
}
void ThreadKey::set(void *v) {
pthread_key_t k = (pthread_key_t)val;
pthread_setspecific(k, v);
}
ThreadKey::ThreadKey(void (*_destr)(void *)) {
pthread_key_create((pthread_key_t*)&val, _destr);
}
ThreadKey::ThreadKey() {
pthread_key_create((pthread_key_t*)&val, NULL);
}
void ThreadKey::initialise() {
pthread_key_create((pthread_key_t*)&val, NULL);
}
void Thread::initialise() {
}
int Thread::start(int *tid, int (*fct)(void *), void *arg) {
int res = pthread_create((pthread_t *)tid, 0, (void * (*)(void *))fct, arg);
pthread_detach(*(pthread_t *)tid);
return res;
}