#ifndef J_THREAD_H #define J_THREAD_H #include class Runnable { public: virtual void run() = 0; }; void* java_lang_Thread_start(void* arg) { Runnable* thread = (Runnable*) arg; thread->run(); } class Thread : public Runnable { pthread_t thread; public: void start() { pthread_create(&thread, 0, java_lang_Thread_start, this); } void join() { pthread_join(thread, 0); } static void sleep(long long millis, int nanos = 0) { timespec interval; interval.tv_nsec = nanos + 1000000 * (millis % 1000); interval.tv_sec = millis / 1000; nanosleep(&interval, 0); } }; class Lock { public: pthread_mutex_t mutex; Lock() { pthread_mutex_init(&mutex, 0); } ~Lock() { pthread_mutex_destroy(&mutex); } void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } }; class Condition { pthread_mutex_t* mutex; pthread_cond_t cond; public: Condition(Lock& l) { mutex = &l.mutex; pthread_cond_init(&cond, 0); } ~Condition() { pthread_cond_destroy(&cond); } void await() { pthread_cond_wait(&cond, mutex); } void signal() { pthread_cond_signal(&cond); } }; #endif