00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <PollingService.hxx>
00019
00020
00021 using namespace std;
00022 using namespace codaObject;
00023
00024
00025
00026
00027
00028
00029
00035 PollingService::PollingService(int timeout)
00036 : pollingThreadId((pthread_t)NULL), pollingTimeout(timeout),
00037 pollingPthreadDispatcher(NULL) {}
00038
00039
00040
00041
00042
00046 void *PollingService::dispatchInterrupt(void*) {
00047 while(true) {
00048 #ifdef VXWORKS
00049 timespec ts = {0, pollingTimeout};
00050 if (pollingTimeout > 1000000000) {
00051 ts.tv_sec = pollingTimeout/1000000000;
00052 ts.tv_nsec = pollingTimeout - ts.tv_sec*1000000000;
00053 }
00054 nanosleep(&ts, NULL);
00055 #else
00056 usleep(pollingTimeout*1000);
00057 #endif
00058 if(myIntObj!=NULL)myIntObj->interrupt(0);
00059 pthread_testcancel();
00060 }
00061 return(NULL);
00062 }
00063
00064
00065
00066
00067
00073 bool PollingService::setupInterrupt(void) {
00074 return(true);
00075 }
00076
00077
00078
00079
00080
00086 bool PollingService::enableInterrupt(void) {
00087
00088 if(pollingPthreadDispatcher==NULL) {
00089
00090
00091 pollingPthreadDispatcher = new pthreadDispatcher<PollingService,void*,void*>(this,&PollingService::dispatchInterrupt,NULL);
00092 if(pthread_create(&pollingThreadId,NULL,pthreadDispatcher<PollingService,void*,void*>::dispatchIt,
00093 (void*)pollingPthreadDispatcher)==0) {
00094
00095 } else {
00096
00097 pollingThreadId=0;
00098 delete(pollingPthreadDispatcher);
00099 pollingPthreadDispatcher=NULL;
00100 string err = "?PollingService...unable to start polling thread";
00101 cerr << err << endl;
00102 myIntObj->daLogMsg(err,DALOG_ERROR);
00103 }
00104
00105 } else {
00106 string err = "?PollingService::enableInterrupt: attempt to start a second interrupt thread ignored";
00107 cerr << err << endl;
00108 myIntObj->daLogMsg(err,DALOG_ERROR);
00109 }
00110
00111 return(true);
00112 }
00113
00114
00115
00116
00117
00123 bool PollingService::pauseInterrupt(void) {
00124 return(deleteInterrupt());
00125 }
00126
00127
00128
00129
00130
00136 bool PollingService::resumeInterrupt(void) {
00137 return(enableInterrupt());
00138 }
00139
00140
00141
00142
00143
00149 bool PollingService::deleteInterrupt(void) {
00150
00151 if(pollingThreadId!=0)pthread_cancel(pollingThreadId);
00152 pollingThreadId=0;
00153
00154 if(pollingPthreadDispatcher!=NULL)delete(pollingPthreadDispatcher);
00155 pollingPthreadDispatcher=NULL;
00156
00157 return(true);
00158 }
00159
00160
00161