BasicTaskScheduler Class Reference

#include <BasicUsageEnvironment.hh>

Inheritance diagram for BasicTaskScheduler:

Inheritance graph
[legend]
Collaboration diagram for BasicTaskScheduler:

Collaboration graph
[legend]

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 BasicTaskSchedulercreateNew ()

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
HandlerSetfReadHandlers
int fLastHandledSocketNum

Detailed Description

Definition at line 47 of file BasicUsageEnvironment.hh.


Member Typedef Documentation

typedef void TaskScheduler::BackgroundHandlerProc(void *clientData, int mask) [inherited]

Definition at line 121 of file UsageEnvironment.hh.


Constructor & Destructor Documentation

BasicTaskScheduler::~BasicTaskScheduler (  )  [virtual]

Definition at line 41 of file BasicTaskScheduler.cpp.

00041                                         {
00042 }

BasicTaskScheduler::BasicTaskScheduler (  )  [protected]

Definition at line 36 of file BasicTaskScheduler.cpp.

References fReadSet.

Referenced by createNew().

00037   : fMaxNumSockets(0) {
00038   FD_ZERO(&fReadSet);
00039 }


Member Function Documentation

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().


Field Documentation

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]

Definition at line 98 of file BasicUsageEnvironment0.hh.

Referenced by SingleStep().


The documentation for this class was generated from the following files:
Generated on Tue Jul 22 06:40:31 2008 for live by  doxygen 1.5.2