[Live-devel] plz help me to understand the cause of the error

Rajesh rajeshkumar.r at imimobile.com
Wed Sep 6 22:02:00 PDT 2006


HI All
I am receiving one error BasicTaskScheduler::SingleStep() function
The error is -->  perror("BasicTaskScheduler::SingleStep(): select() fails");

/////////////////////////////////////////////////////////////////////////////////////////
void BasicTaskScheduler::SingleStep(unsigned maxDelayTime) 
{
  fd_set readSet = fReadSet; // make a copy for this select() call
  
  DelayInterval const& timeToDelay = fDelayQueue.timeToNextAlarm();
  struct timeval tv_timeToDelay;
  tv_timeToDelay.tv_sec = timeToDelay.seconds();
  tv_timeToDelay.tv_usec = timeToDelay.useconds();
  // Very large "tv_sec" values cause select() to fail.
  // Don't make it any larger than 1 million seconds (11.5 days)
  const long MAX_TV_SEC = MILLION;
  if (tv_timeToDelay.tv_sec > MAX_TV_SEC)
  {
    tv_timeToDelay.tv_sec = MAX_TV_SEC;
  }
  // Also check our "maxDelayTime" parameter (if it's > 0):
  if (maxDelayTime > 0 &&
      (tv_timeToDelay.tv_sec > (long)maxDelayTime/MILLION ||
       (tv_timeToDelay.tv_sec == (long)maxDelayTime/MILLION &&
 tv_timeToDelay.tv_usec > (long)maxDelayTime%MILLION)))
  {
    tv_timeToDelay.tv_sec = maxDelayTime/MILLION;
    tv_timeToDelay.tv_usec = maxDelayTime%MILLION;
  }
  
  int selectResult = select(fMaxNumSockets, &readSet, NULL, NULL,
       &tv_timeToDelay);
  if (selectResult < 0)
  {
#if defined(__WIN32__) || defined(_WIN32)
    int err = WSAGetLastError();
    // For some unknown reason, select() in Windoze sometimes fails with WSAEINVAL if
    // it was called with no entries set in "readSet".  If this happens, ignore it:
    if (err == WSAEINVAL && readSet.fd_count == 0)
 {
  err = 0;
  // To stop this from happening again, create a dummy readable socket:
  int dummySocketNum = socket(AF_INET, SOCK_DGRAM, 0);
  FD_SET((unsigned)dummySocketNum, &fReadSet);
    }
    if (err != 0) 
 {
#else
  if (errno != EINTR && errno != EAGAIN) 
  {
#endif
   // Unexpected error - treat this as fatal:
#if !defined(_WIN32_WCE)
   perror("BasicTaskScheduler::SingleStep(): select() fails");
#endif
   exit(0);
  }
 }
 
  // Handle any delayed event that may have come due:
  fDelayQueue.handleAlarm();
  
  // Call the handler function for one readable socket:
  HandlerIterator iter(*fReadHandlers);
  HandlerDescriptor* handler;
  // To ensure forward progress through the handlers, begin past the last
  // socket number that we handled:
  if (fLastHandledSocketNum >= 0) {
    while ((handler = iter.next()) != NULL) {
      if (handler->socketNum == fLastHandledSocketNum) break;
    }
    if (handler == NULL) {
      fLastHandledSocketNum = -1;
      iter.reset(); // start from the beginning instead
    }
  }
  while ((handler = iter.next()) != NULL) {
    if (FD_ISSET(handler->socketNum, &readSet) &&
 FD_ISSET(handler->socketNum, &fReadSet) /* sanity check */ &&
 handler->handlerProc != NULL) {
      fLastHandledSocketNum = handler->socketNum;
          // Note: we set "fLastHandledSocketNum" before calling the handler,
          // in case the handler calls "doEventLoop()" reentrantly.
      (*handler->handlerProc)(handler->clientData, SOCKET_READABLE);
      break;
    }
  }
  if (handler == NULL && fLastHandledSocketNum >= 0) {
    // We didn't call a handler, but we didn't get to check all of them,
    // so try again from the beginning:
    iter.reset();
    while ((handler = iter.next()) != NULL) {
      if (FD_ISSET(handler->socketNum, &readSet) &&
   FD_ISSET(handler->socketNum, &fReadSet) /* sanity check */ &&
   handler->handlerProc != NULL) {
 fLastHandledSocketNum = handler->socketNum;
     // Note: we set "fLastHandledSocketNum" before calling the handler,
            // in case the handler calls "doEventLoop()" reentrantly.
 (*handler->handlerProc)(handler->clientData, SOCKET_READABLE);
 break;
      }
    }
    if (handler == NULL) fLastHandledSocketNum = -1;//because we didn't call a handler
  }
}
//////////////////////////////////////////////////////////////////////////

with regards
rajesh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.live555.com/pipermail/live-devel/attachments/20060906/5edc1e23/attachment.html 


More information about the live-devel mailing list