00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "BasicUsageEnvironment0.hh"
00021 #include "HandlerSet.hh"
00022
00025
00026 class AlarmHandler: public DelayQueueEntry {
00027 public:
00028 AlarmHandler(TaskFunc* proc, void* clientData, DelayInterval timeToDelay)
00029 : DelayQueueEntry(timeToDelay), fProc(proc), fClientData(clientData) {
00030 }
00031
00032 private:
00033 virtual void handleTimeout() {
00034 (*fProc)(fClientData);
00035 DelayQueueEntry::handleTimeout();
00036 }
00037
00038 private:
00039 TaskFunc* fProc;
00040 void* fClientData;
00041 };
00042
00043
00045
00046 BasicTaskScheduler0::BasicTaskScheduler0()
00047 : fLastHandledSocketNum(-1) {
00048 fReadHandlers = new HandlerSet;
00049 }
00050
00051 BasicTaskScheduler0::~BasicTaskScheduler0() {
00052 delete fReadHandlers;
00053 }
00054
00055 TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds,
00056 TaskFunc* proc,
00057 void* clientData) {
00058 if (microseconds < 0) microseconds = 0;
00059 DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000));
00060 AlarmHandler* alarmHandler = new AlarmHandler(proc, clientData, timeToDelay);
00061 fDelayQueue.addEntry(alarmHandler);
00062
00063 return (void*)(alarmHandler->token());
00064 }
00065
00066 void BasicTaskScheduler0::unscheduleDelayedTask(TaskToken& prevTask) {
00067 DelayQueueEntry* alarmHandler = fDelayQueue.removeEntry((long)prevTask);
00068 prevTask = NULL;
00069 delete alarmHandler;
00070 }
00071
00072 void BasicTaskScheduler0::doEventLoop(char* watchVariable) {
00073
00074 while (1) {
00075 if (watchVariable != NULL && *watchVariable != 0) break;
00076 SingleStep();
00077 }
00078 }
00079
00080
00082
00083 HandlerDescriptor::HandlerDescriptor(HandlerDescriptor* nextHandler) {
00084
00085 if (nextHandler == this) {
00086 fNextHandler = fPrevHandler = this;
00087 } else {
00088 fNextHandler = nextHandler;
00089 fPrevHandler = nextHandler->fPrevHandler;
00090 nextHandler->fPrevHandler = this;
00091 fPrevHandler->fNextHandler = this;
00092 }
00093 }
00094
00095 HandlerDescriptor::~HandlerDescriptor() {
00096
00097 fNextHandler->fPrevHandler = fPrevHandler;
00098 fPrevHandler->fNextHandler = fNextHandler;
00099 }
00100
00101 HandlerSet::HandlerSet()
00102 : fHandlers(&fHandlers) {
00103 fHandlers.socketNum = -1;
00104 }
00105
00106 HandlerSet::~HandlerSet() {
00107
00108 while (fHandlers.fNextHandler != &fHandlers) {
00109 delete fHandlers.fNextHandler;
00110 }
00111 }
00112
00113 void HandlerSet
00114 ::assignHandler(int socketNum,
00115 TaskScheduler::BackgroundHandlerProc* handlerProc,
00116 void* clientData) {
00117
00118 HandlerDescriptor* handler;
00119 HandlerIterator iter(*this);
00120 while ((handler = iter.next()) != NULL) {
00121 if (handler->socketNum == socketNum) break;
00122 }
00123 if (handler == NULL) {
00124 handler = new HandlerDescriptor(fHandlers.fNextHandler);
00125 handler->socketNum = socketNum;
00126 }
00127
00128 handler->handlerProc = handlerProc;
00129 handler->clientData = clientData;
00130 }
00131
00132 void HandlerSet::removeHandler(int socketNum) {
00133 HandlerDescriptor* handler;
00134 HandlerIterator iter(*this);
00135 while ((handler = iter.next()) != NULL) {
00136 if (handler->socketNum == socketNum) {
00137 delete handler;
00138 break;
00139 }
00140 }
00141 }
00142
00143 HandlerIterator::HandlerIterator(HandlerSet& handlerSet)
00144 : fOurSet(handlerSet) {
00145 reset();
00146 }
00147
00148 HandlerIterator::~HandlerIterator() {
00149 }
00150
00151 void HandlerIterator::reset() {
00152 fNextPtr = fOurSet.fHandlers.fNextHandler;
00153 }
00154
00155 HandlerDescriptor* HandlerIterator::next() {
00156 HandlerDescriptor* result = fNextPtr;
00157 if (result == &fOurSet.fHandlers) {
00158 result = NULL;
00159 } else {
00160 fNextPtr = fNextPtr->fNextHandler;
00161 }
00162
00163 return result;
00164 }