#include <BasicUsageEnvironment.hh>
Inheritance diagram for BasicTaskScheduler:


Public Types | |
| typedef void | BackgroundHandlerProc (void *clientData, int mask) |
Public Member Functions | |
| virtual | ~BasicTaskScheduler () |
| virtual TaskToken | scheduleDelayedTask (int64_t microseconds, TaskFunc *proc, void *clientData) |
| virtual void | unscheduleDelayedTask (TaskToken &prevTask) |
| virtual void | doEventLoop (char *watchVariable) |
| virtual void | rescheduleDelayedTask (TaskToken &task, int64_t microseconds, TaskFunc *proc, void *clientData) |
| virtual void | turnOnBackgroundReadHandling (int socketNum, BackgroundHandlerProc *handlerProc, void *clientData)=0 |
Static Public Member Functions | |
| static BasicTaskScheduler * | createNew () |
Protected Member Functions | |
| BasicTaskScheduler () | |
| virtual void | SingleStep (unsigned maxDelayTime) |
| virtual void | turnOnBackgroundReadHandling (int socketNum, BackgroundHandlerProc *handlerProc, void *clientData) |
| virtual void | turnOffBackgroundReadHandling (int socketNum) |
Protected Attributes | |
| int | fMaxNumSockets |
| fd_set | fReadSet |
| DelayQueue | fDelayQueue |
| HandlerSet * | fReadHandlers |
| int | fLastHandledSocketNum |
Definition at line 47 of file BasicUsageEnvironment.hh.
typedef void TaskScheduler::BackgroundHandlerProc(void *clientData, int mask) [inherited] |
Definition at line 121 of file UsageEnvironment.hh.
| BasicTaskScheduler::~BasicTaskScheduler | ( | ) | [virtual] |
| BasicTaskScheduler::BasicTaskScheduler | ( | ) | [protected] |
Definition at line 36 of file BasicTaskScheduler.cpp.
References fReadSet.
Referenced by createNew().
00037 : fMaxNumSockets(0) { 00038 FD_ZERO(&fReadSet); 00039 }
| BasicTaskScheduler * BasicTaskScheduler::createNew | ( | ) | [static] |
Definition at line 32 of file BasicTaskScheduler.cpp.
References BasicTaskScheduler().
Referenced by main().
00032 { 00033 return new BasicTaskScheduler(); 00034 }
| void BasicTaskScheduler::SingleStep | ( | unsigned | maxDelayTime | ) | [protected, virtual] |
Implements BasicTaskScheduler0.
Definition at line 48 of file BasicTaskScheduler.cpp.
References HandlerDescriptor::clientData, BasicTaskScheduler0::fDelayQueue, BasicTaskScheduler0::fLastHandledSocketNum, fMaxNumSockets, BasicTaskScheduler0::fReadHandlers, fReadSet, DelayQueue::handleAlarm(), HandlerDescriptor::handlerProc, iter, MILLION, MediaSubsessionIterator::next(), NULL, MediaSubsessionIterator::reset(), Timeval::seconds(), SOCKET_READABLE, HandlerDescriptor::socketNum, DelayQueue::timeToNextAlarm(), and Timeval::useconds().
00048 { 00049 fd_set readSet = fReadSet; // make a copy for this select() call 00050 00051 DelayInterval const& timeToDelay = fDelayQueue.timeToNextAlarm(); 00052 struct timeval tv_timeToDelay; 00053 tv_timeToDelay.tv_sec = timeToDelay.seconds(); 00054 tv_timeToDelay.tv_usec = timeToDelay.useconds(); 00055 // Very large "tv_sec" values cause select() to fail. 00056 // Don't make it any larger than 1 million seconds (11.5 days) 00057 const long MAX_TV_SEC = MILLION; 00058 if (tv_timeToDelay.tv_sec > MAX_TV_SEC) { 00059 tv_timeToDelay.tv_sec = MAX_TV_SEC; 00060 } 00061 // Also check our "maxDelayTime" parameter (if it's > 0): 00062 if (maxDelayTime > 0 && 00063 (tv_timeToDelay.tv_sec > (long)maxDelayTime/MILLION || 00064 (tv_timeToDelay.tv_sec == (long)maxDelayTime/MILLION && 00065 tv_timeToDelay.tv_usec > (long)maxDelayTime%MILLION))) { 00066 tv_timeToDelay.tv_sec = maxDelayTime/MILLION; 00067 tv_timeToDelay.tv_usec = maxDelayTime%MILLION; 00068 } 00069 00070 int selectResult = select(fMaxNumSockets, &readSet, NULL, NULL, 00071 &tv_timeToDelay); 00072 if (selectResult < 0) { 00073 #if defined(__WIN32__) || defined(_WIN32) 00074 int err = WSAGetLastError(); 00075 // For some unknown reason, select() in Windoze sometimes fails with WSAEINVAL if 00076 // it was called with no entries set in "readSet". If this happens, ignore it: 00077 if (err == WSAEINVAL && readSet.fd_count == 0) { 00078 err = 0; 00079 // To stop this from happening again, create a dummy readable socket: 00080 int dummySocketNum = socket(AF_INET, SOCK_DGRAM, 0); 00081 FD_SET((unsigned)dummySocketNum, &fReadSet); 00082 } 00083 if (err != 0) { 00084 #else 00085 if (errno != EINTR && errno != EAGAIN) { 00086 #endif 00087 // Unexpected error - treat this as fatal: 00088 #if !defined(_WIN32_WCE) 00089 perror("BasicTaskScheduler::SingleStep(): select() fails"); 00090 #endif 00091 exit(0); 00092 } 00093 } 00094 00095 // Handle any delayed event that may have come due: 00096 fDelayQueue.handleAlarm(); 00097 00098 // Call the handler function for one readable socket: 00099 HandlerIterator iter(*fReadHandlers); 00100 HandlerDescriptor* handler; 00101 // To ensure forward progress through the handlers, begin past the last 00102 // socket number that we handled: 00103 if (fLastHandledSocketNum >= 0) { 00104 while ((handler = iter.next()) != NULL) { 00105 if (handler->socketNum == fLastHandledSocketNum) break; 00106 } 00107 if (handler == NULL) { 00108 fLastHandledSocketNum = -1; 00109 iter.reset(); // start from the beginning instead 00110 } 00111 } 00112 while ((handler = iter.next()) != NULL) { 00113 if (FD_ISSET(handler->socketNum, &readSet) && 00114 FD_ISSET(handler->socketNum, &fReadSet) /* sanity check */ && 00115 handler->handlerProc != NULL) { 00116 fLastHandledSocketNum = handler->socketNum; 00117 // Note: we set "fLastHandledSocketNum" before calling the handler, 00118 // in case the handler calls "doEventLoop()" reentrantly. 00119 (*handler->handlerProc)(handler->clientData, SOCKET_READABLE); 00120 break; 00121 } 00122 } 00123 if (handler == NULL && fLastHandledSocketNum >= 0) { 00124 // We didn't call a handler, but we didn't get to check all of them, 00125 // so try again from the beginning: 00126 iter.reset(); 00127 while ((handler = iter.next()) != NULL) { 00128 if (FD_ISSET(handler->socketNum, &readSet) && 00129 FD_ISSET(handler->socketNum, &fReadSet) /* sanity check */ && 00130 handler->handlerProc != NULL) { 00131 fLastHandledSocketNum = handler->socketNum; 00132 // Note: we set "fLastHandledSocketNum" before calling the handler, 00133 // in case the handler calls "doEventLoop()" reentrantly. 00134 (*handler->handlerProc)(handler->clientData, SOCKET_READABLE); 00135 break; 00136 } 00137 } 00138 if (handler == NULL) fLastHandledSocketNum = -1;//because we didn't call a handler 00139 } 00140 }
| void BasicTaskScheduler::turnOnBackgroundReadHandling | ( | int | socketNum, | |
| BackgroundHandlerProc * | handlerProc, | |||
| void * | clientData | |||
| ) | [protected, virtual] |
Definition at line 142 of file BasicTaskScheduler.cpp.
References HandlerSet::assignHandler(), fMaxNumSockets, BasicTaskScheduler0::fReadHandlers, and fReadSet.
00144 { 00145 if (socketNum < 0) return; 00146 FD_SET((unsigned)socketNum, &fReadSet); 00147 fReadHandlers->assignHandler(socketNum, handlerProc, clientData); 00148 00149 if (socketNum+1 > fMaxNumSockets) { 00150 fMaxNumSockets = socketNum+1; 00151 } 00152 }
| void BasicTaskScheduler::turnOffBackgroundReadHandling | ( | int | socketNum | ) | [protected, virtual] |
Implements TaskScheduler.
Definition at line 154 of file BasicTaskScheduler.cpp.
References fMaxNumSockets, BasicTaskScheduler0::fReadHandlers, fReadSet, and HandlerSet::removeHandler().
00154 { 00155 if (socketNum < 0) return; 00156 FD_CLR((unsigned)socketNum, &fReadSet); 00157 fReadHandlers->removeHandler(socketNum); 00158 00159 if (socketNum+1 == fMaxNumSockets) { 00160 --fMaxNumSockets; 00161 } 00162 }
| TaskToken BasicTaskScheduler0::scheduleDelayedTask | ( | int64_t | microseconds, | |
| TaskFunc * | proc, | |||
| void * | clientData | |||
| ) | [virtual, inherited] |
Implements TaskScheduler.
Definition at line 55 of file BasicTaskScheduler0.cpp.
References DelayQueue::addEntry(), BasicTaskScheduler0::fDelayQueue, and DelayQueueEntry::token().
00057 { 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 }
| void BasicTaskScheduler0::unscheduleDelayedTask | ( | TaskToken & | prevTask | ) | [virtual, inherited] |
Implements TaskScheduler.
Definition at line 66 of file BasicTaskScheduler0.cpp.
References BasicTaskScheduler0::fDelayQueue, NULL, and DelayQueue::removeEntry().
00066 { 00067 DelayQueueEntry* alarmHandler = fDelayQueue.removeEntry((long)prevTask); 00068 prevTask = NULL; 00069 delete alarmHandler; 00070 }
| void BasicTaskScheduler0::doEventLoop | ( | char * | watchVariable | ) | [virtual, inherited] |
Implements TaskScheduler.
Definition at line 72 of file BasicTaskScheduler0.cpp.
References NULL, and BasicTaskScheduler0::SingleStep().
00072 { 00073 // Repeatedly loop, handling readble sockets and timed events: 00074 while (1) { 00075 if (watchVariable != NULL && *watchVariable != 0) break; 00076 SingleStep(); 00077 } 00078 }
| void TaskScheduler::rescheduleDelayedTask | ( | TaskToken & | task, | |
| int64_t | microseconds, | |||
| TaskFunc * | proc, | |||
| void * | clientData | |||
| ) | [virtual, inherited] |
Definition at line 40 of file UsageEnvironment.cpp.
References TaskScheduler::scheduleDelayedTask(), and TaskScheduler::unscheduleDelayedTask().
Referenced by RTSPServer::RTSPClientSession::noteLiveness().
00042 { 00043 unscheduleDelayedTask(task); 00044 task = scheduleDelayedTask(microseconds, proc, clientData); 00045 }
| virtual void TaskScheduler::turnOnBackgroundReadHandling | ( | int | socketNum, | |
| BackgroundHandlerProc * | handlerProc, | |||
| void * | clientData | |||
| ) | [pure virtual, inherited] |
Referenced by ByteStreamFileSource::doGetNextFrame(), BasicUDPSource::doGetNextFrame(), RTSPOverHTTPServer::HTTPClientConnection::HTTPClientConnection(), SIPClient::invite1(), RTSPClient::playMediaSession(), RTSPServer::RTSPClientSession::RTSPClientSession(), RTSPOverHTTPServer::RTSPOverHTTPServer(), and RTSPServer::RTSPServer().
int BasicTaskScheduler::fMaxNumSockets [protected] |
Definition at line 67 of file BasicUsageEnvironment.hh.
Referenced by SingleStep(), turnOffBackgroundReadHandling(), and turnOnBackgroundReadHandling().
fd_set BasicTaskScheduler::fReadSet [protected] |
Definition at line 68 of file BasicUsageEnvironment.hh.
Referenced by BasicTaskScheduler(), SingleStep(), turnOffBackgroundReadHandling(), and turnOnBackgroundReadHandling().
DelayQueue BasicTaskScheduler0::fDelayQueue [protected, inherited] |
Definition at line 94 of file BasicUsageEnvironment0.hh.
Referenced by BasicTaskScheduler0::scheduleDelayedTask(), SingleStep(), and BasicTaskScheduler0::unscheduleDelayedTask().
HandlerSet* BasicTaskScheduler0::fReadHandlers [protected, inherited] |
Definition at line 97 of file BasicUsageEnvironment0.hh.
Referenced by BasicTaskScheduler0::BasicTaskScheduler0(), SingleStep(), turnOffBackgroundReadHandling(), turnOnBackgroundReadHandling(), and BasicTaskScheduler0::~BasicTaskScheduler0().
int BasicTaskScheduler0::fLastHandledSocketNum [protected, inherited] |
1.5.2