long ACE_Proactor::schedule_timer (ACE_Handler &handler, const void *act, const ACE_Time_Value &time, const ACE_Time_Value &interval) { // absolute time. ACE_Time_Value absolute_time = this->timer_queue_->gettimeofday () + time; // Only one guy goes in here at a time ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon, this->timer_queue_->mutex (), -1)); // Remember the old proactor. ACE_Proactor *old_proactor = handler.proactor (); // Assign *this* Proactor to the handler. handler.proactor (this); // Schedule the timer long result = this->timer_queue_->schedule (&handler, act, absolute_time, interval); if (result != -1) { // no failures: check to see if we are the earliest time if (this->timer_queue_->earliest_time () == absolute_time) // wake up the timer thread if (this->timer_handler_->timer_event_.signal () == -1) { // Cancel timer this->timer_queue_->cancel (result); result = -1; } } if (result == -1) { // Reset the old proactor in case of failures. handler.proactor (old_proactor); } return result; }