hello, please note the followed code:
 ////////// BasicTaskScheduler //////////
 BasicTaskScheduler* BasicTaskScheduler::createNew() {
 return new BasicTaskScheduler();
}
 #define MAX_SCHEDULER_GRANULARITY 10000 // 10 microseconds: We will return to 
the event loop at least this often
static void schedulerTickTask(void* clientData) {
  
((BasicTaskScheduler*)clientData)->scheduleDelayedTask(MAX_SCHEDULER_GRANULARITY,
 schedulerTickTask, clientData);
}
 BasicTaskScheduler::BasicTaskScheduler()
  : fMaxNumSockets(0) {
  FD_ZERO(&fReadSet);
  FD_ZERO(&fWriteSet);
  FD_ZERO(&fExceptionSet);
   schedulerTickTask(this); // ensures that we handle events frequently
}
 BasicTaskScheduler::~BasicTaskScheduler() {
}
  
 this code scheduled a task "schedulerTickTask" when construction, but not 
unscheduler it.
 so, when the BasicTaskScheduler object destruct, it will be mem leak.
  
 class BasicTaskScheduler: public BasicTaskScheduler0 {
public:
  static BasicTaskScheduler* createNew();
  virtual ~BasicTaskScheduler();
 public:
  void schedulerTickTask();
 protected:
  BasicTaskScheduler();
      // called only by "createNew()"
 protected:
  // Redefined virtual functions:
  virtual void SingleStep(unsigned maxDelayTime);
   virtual void setBackgroundHandling(int socketNum, int conditionSet, 
BackgroundHandlerProc* handlerProc, void* clientData);
  virtual void moveSocketHandling(int oldSocketNum, int newSocketNum);
 protected:
  // To implement background operations:
  int fMaxNumSockets;
  fd_set fReadSet;
  fd_set fWriteSet;
  fd_set fExceptionSet;
   TaskToken fTickTask; // !!! THIS ONE !!!
};
 
 ////////// BasicTaskScheduler //////////
 BasicTaskScheduler* BasicTaskScheduler::createNew() {
 return new BasicTaskScheduler();
}
 #define MAX_SCHEDULER_GRANULARITY 10000 // 10 microseconds: We will return to 
the event loop at least this often
static void schedulerTickTask(void* clientData) {
  ((BasicTaskScheduler*)clientData)->schedulerTickTask();
}
 void BasicTaskScheduler::schedulerTickTask()
{
  fTickTask = scheduleDelayedTask(MAX_SCHEDULER_GRANULARITY, 
::schedulerTickTask, this);
}
 BasicTaskScheduler::BasicTaskScheduler()
  : fMaxNumSockets(0) {
  FD_ZERO(&fReadSet);
  FD_ZERO(&fWriteSet);
  FD_ZERO(&fExceptionSet);
  schedulerTickTask(); // ensures that we handle events frequently
}
 BasicTaskScheduler::~BasicTaskScheduler() {
  unscheduleDelayedTask(fTickTask); fTickTask = NULL;
}

 /////
 thanks
_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to