Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

rtc.h

00001 // Copyright (C) 2002 Jean-Marc Valin
00002 
00003 #ifndef _RTC_H
00004 #define _RTC_H
00005 
00006 #include <pthread.h>
00007 #include "pseudosem.h"
00008 #include <list>
00009 
00010 namespace FD {
00011 
00012 class RTCTimer;
00013 
00014 class RTCUser {
00015    pseudosem_t sem;
00016    float period;
00017    float next;
00018 public:
00019    RTCUser(float p) : period(p) , next(p) {pseudosem_init(&sem,0,0);}
00020    ~RTCUser() {pseudosem_destroy(&sem);}
00021    void wait() {pseudosem_wait(&sem);}
00022    void wait(float d) {set(d); pseudosem_wait(&sem);}
00023 protected:
00024    bool dec(float t) {next-=t;if (next>0) return false; else {next+=period;return true;}}
00025    void set(float d) {next=d;}
00026    void interrupt(float time) {while (dec(time)) {pseudosem_post(&sem);}}
00027    friend class RTCTimer;
00028 };
00029 
00030 class RTCTimer {
00031    int fd;
00032    pthread_t thread;
00033    pthread_mutex_t lock;
00034    std::list<RTCUser *> users;
00035    bool exit_status;
00036    int freq;
00037    float dt;
00038 public:
00039    static RTCUser *create(float delay);
00040    static void destroy(RTCUser *u);
00041    //static int wait(int delay=0);
00042    //protected:
00043    RTCTimer();
00044    ~RTCTimer();
00045    static RTCTimer &instance();
00046    void runThread();
00047    friend class RTCUser;
00048 };
00049 
00050 }//namespace FD
00051 #endif

Generated on Wed Oct 5 14:28:56 2005 for FlowDesigner by  doxygen 1.4.4