initial commit
[goodguy/history.git] / cinelerra-5.0 / db / thr.h
1 #ifndef __THR_H__
2 #define __THR_H__
3 #include <cstdio>
4 #include <stdlib.h>
5 #include <signal.h>
6 #include <pthread.h>
7
8 class Mutex;
9 class Condition;
10
11 class Mutex {
12   pthread_mutex_t mutex;
13 public:
14   friend class Condition;
15   Mutex() { pthread_mutex_init(&mutex, 0); }
16   ~Mutex() { pthread_mutex_destroy(&mutex); }
17   int lock() { return pthread_mutex_lock(&mutex); }
18   int trylock() { return pthread_mutex_trylock(&mutex); }
19   int unlock() { return pthread_mutex_unlock(&mutex); }
20   void reset() { pthread_mutex_destroy(&mutex); pthread_mutex_init(&mutex,0); }
21 };
22
23 class Condition : public Mutex {
24   pthread_cond_t cond;
25   int init_v;
26   volatile int v;
27 public:
28   int lock() {
29     Mutex::lock();  while(v <= 0) pthread_cond_wait(&cond, &mutex);
30     --v;  Mutex::unlock(); return 0;
31   }
32   void unlock() { Mutex::lock(); ++v; pthread_cond_signal(&cond); Mutex::unlock(); }
33   Condition(int iv=1) : init_v(iv) {
34     v = init_v;  pthread_cond_init(&cond, NULL);
35   }
36   ~Condition() { pthread_cond_destroy(&cond); }
37   void reset() {
38     pthread_cond_destroy(&cond); pthread_cond_init(&cond, NULL);
39     Mutex::reset();  v = 1;
40   }
41 };
42
43 class Thread {
44 private:
45   int started, active;
46   pthread_t owner_tid, tid;
47 public:
48   virtual void run() = 0;
49   static void *proc(void *t) { ((Thread*)t)->run(); return 0; }
50   pthread_t owner() { return owner_tid; }
51   pthread_t self() { return tid; }
52   int running() { return active; }
53   int cancel() {
54     if( started ) { started = 0; pthread_cancel(tid); }
55     return 0;
56   }
57   void start() {
58     started = active = 1;
59     pthread_create(&tid, 0, proc,(void*)this);
60   }
61   void join() { if( active ) { pthread_join(tid, 0); active = 0; } }
62   void pause() { pthread_kill(tid, SIGSTOP); }
63   void resume() { pthread_kill(tid, SIGCONT); }
64   Thread() { started = active = 0; owner_tid = pthread_self(); }
65   virtual ~Thread() {}
66
67 };
68
69 // old stuff
70
71 class thread : public Thread {
72   int done;
73   Condition ready;
74 public:
75   thread() { done = 0;  ready.lock();  start(); }
76   ~thread() { Kill(); }
77
78   virtual void Proc () = 0;
79   void run() { while( !done ) { ready.lock(); if( !done ) Proc(); } }
80   void Run() { ready.unlock(); }
81   void Kill() { done = 1; Run(); join(); }
82 };
83
84 class Lock : public Mutex {};
85
86 static inline void yield() { pthread_yield(); }
87
88 #endif