sync.hh
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:3k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: sync.hh
  3.    Description:
  4.    Synchronized system of data objects based on a common timer 
  5.    Created: March 1996, Alex Theo de Jong, NIST
  6. */
  7. #ifndef __sync_hh
  8. #define __sync_hh
  9. #ifdef __GNUG__
  10. #pragma interface
  11. #endif
  12. const int Max_Sync_Process =   4;
  13. // Thread-Safe queue for time stamps and bytes
  14. class StampQueue {
  15. #ifdef TRACE
  16.   friend class Synchronization;
  17. #endif
  18.  private:
  19.   MutexLock data_lock;
  20.   Semaphore in, out;
  21.   int index_in, index_out;
  22.   double* stamps;
  23.   int* bytes;
  24.  protected:
  25.   // variables for update/wait
  26.   int resync;
  27.   double newtime;
  28.  protected:
  29.   int maximum, total;
  30.   StampQueue(int size);
  31.   ~StampQueue();
  32.   void lock(){ data_lock.lock(); }
  33.   void unlock(){ data_lock.unlock(); }
  34.   int wait_in(){ return in.P(); }
  35.   int wait_out(){ return out.P(); }
  36.   int post_in(){ return in.V(); }
  37.   int post_out(){ return out.V(); }
  38.  public:
  39.   int get(double& stamp);
  40.   int get(double& stamp, int& bytes);
  41.   int put(const double stamp, const int bytes=0);
  42. };
  43. /*
  44.   Timer that runs independent of other threads
  45.   Takes new time from time stamp queue and signals blocked threads
  46. */
  47. class SyncTimer : public StampQueue {
  48.   friend class SyncData;
  49.   friend class Synchronization;
  50.   // locking/condition for communication with other threads
  51.   MutexLock time_lock;
  52.   Condition time_cond;
  53.   // Current decoder time
  54.   double time;
  55.  protected:
  56.   void lock(){ time_lock.lock(); }
  57.   void unlock(){ time_lock.unlock(); }
  58.  public:
  59.   SyncTimer(int size);
  60.   int update();  // returns True when re-sync is needed
  61.   int done();
  62. };
  63. /*
  64.   Data synchronized on timer
  65.   Takes time stamp from time stamp queue and waits until
  66.   time is expired (compared to timer). A "done" sema is 
  67.   set to indicate synchornization with timer
  68. */
  69. class SyncData : public StampQueue {
  70.   friend class Synchronization;
  71.   int terminated;
  72.   SyncTimer* timer; // decoder clock (local or encoder)
  73.   double time;      // current time in thread
  74.   int bytes;        // bytes <=0  -> re-sync
  75.   // locking/condition for communication with timer thread
  76.   MutexLock time_lock;
  77.   Condition time_cond;
  78.   MutexLock byte_lock;
  79.  protected:
  80.   void bytelock(){ byte_lock.lock(); }
  81.   void byteunlock(){ byte_lock.unlock(); }
  82.  public:
  83.   SyncData(int size, SyncTimer* t);
  84. #ifdef UPTIGHT
  85.   int usedbytes(int b){ bytelock(); bytes-=b; byteunlock(); return bytes; }
  86. #else
  87.   int usedbytes(int b){ return bytes-=b; }
  88. #endif
  89.   // number of bytes used
  90.   int wait();   // wait for time to pass time stamp
  91.   int skip();   // skip last time stamp
  92.   int update(); // wait for thread to synchronize with timer
  93.   int done(int term=0);
  94. };
  95. /*
  96.   Synchronization
  97.   Synchronizes several data objects on a common timer. Initiates
  98.   an independent timer thread that updates data threads with the
  99.   new time. Threads are know by an "id" (ie. number assigned at 
  100.   compile time): id=[1..Max_Sync_Process] (id=0, Timer).
  101.   Synchronization type 0 (2xdata), 1 (1xdata, id=0), 2 (1xdata, id=2).
  102. */
  103. class Synchronization {
  104.   SyncData* syncs[Max_Sync_Process];
  105.   SyncTimer timer; // decoder timer (local or encoder)
  106.   int terminate;   // action
  107.   int terminated;  // indicator
  108.   athr_t id;     // thread to update timer
  109.  protected:
  110.   static void* init(Synchronization* s);
  111.  public:
  112.   Synchronization(int type, int t_qsize, int f_qsize);
  113.   ~Synchronization(); 
  114.   int usedbytes(int ID, int b);
  115.   int wait(int ID);
  116.   int skip(int ID);
  117.   int put(const double stamp);
  118.   int put(int ID, const double s, const int b);
  119.   int pause();   // stop timer
  120.   int resume(); // continu timer
  121.   int done(int ID);
  122.   int stop();
  123. };
  124. #endif // __sync_hh