#ifndef __THR_H__ #define __THR_H__ #include #include #include #include class Mutex; class Condition; class Mutex { pthread_mutex_t mutex; public: friend class Condition; Mutex() { pthread_mutex_init(&mutex, 0); } ~Mutex() { pthread_mutex_destroy(&mutex); } int lock() { return pthread_mutex_lock(&mutex); } int trylock() { return pthread_mutex_trylock(&mutex); } int unlock() { return pthread_mutex_unlock(&mutex); } void reset() { pthread_mutex_destroy(&mutex); pthread_mutex_init(&mutex,0); } }; class Condition : public Mutex { pthread_cond_t cond; int init_v; volatile int v; public: int lock() { Mutex::lock(); while(v <= 0) pthread_cond_wait(&cond, &mutex); --v; Mutex::unlock(); return 0; } void unlock() { Mutex::lock(); ++v; pthread_cond_signal(&cond); Mutex::unlock(); } Condition(int iv=1) : init_v(iv) { v = init_v; pthread_cond_init(&cond, NULL); } ~Condition() { pthread_cond_destroy(&cond); } void reset() { pthread_cond_destroy(&cond); pthread_cond_init(&cond, NULL); Mutex::reset(); v = 1; } }; class Thread { private: int started, active; pthread_t owner_tid, tid; public: virtual void run() = 0; static void *proc(void *t) { ((Thread*)t)->run(); return 0; } pthread_t owner() { return owner_tid; } pthread_t self() { return tid; } int running() { return active; } int cancel() { if( started ) { started = 0; pthread_cancel(tid); } return 0; } void start() { started = active = 1; pthread_create(&tid, 0, proc,(void*)this); } void join() { if( active ) { pthread_join(tid, 0); active = 0; } } void pause() { pthread_kill(tid, SIGSTOP); } void resume() { pthread_kill(tid, SIGCONT); } Thread() { started = active = 0; owner_tid = pthread_self(); } virtual ~Thread() {} }; // old stuff class thread : public Thread { int done; Condition ready; public: thread() { done = 0; ready.lock(); start(); } ~thread() { Kill(); } virtual void Proc () = 0; void run() { while( !done ) { ready.lock(); if( !done ) Proc(); } } void Run() { ready.unlock(); } void Kill() { done = 1; Run(); join(); } }; class Lock : public Mutex {}; static inline void yield() { pthread_yield(); } #endif