www.pudn.com > ACE-5.3 > Asynch_Pseudo_Task.cpp, change:2002-04-20,size:9073b
// Asynch_Pseudo_Task.cpp,v 1.2 2002/04/21 00:00:36 crodrigu Exp
#include "ace/Asynch_Pseudo_Task.h"
ACE_RCSID(ace, Asynch_Pseudo_Task, "Asynch_Pseudo_Task.cpp,v 1.2 2002/04/21 00:00:36 crodrigu Exp")
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task()
: flg_active_ (0),
select_reactor_ (), // should be initialized before reactor_
reactor_ (&select_reactor_, 0), // don't delete implementation
token_ (select_reactor_.lock ()), // we can use reactor token
finish_count_ (0)
{
}
ACE_Asynch_Pseudo_Task::~ACE_Asynch_Pseudo_Task()
{
stop();
}
int
ACE_Asynch_Pseudo_Task::is_active (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
return flg_active_;
}
int
ACE_Asynch_Pseudo_Task::start (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:%p\n"),
ACE_LIB_TEXT ("ACE_Asynch_Pseudo_Task::start already started")),
-1);
if (this->reactor_.initialized () == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:%p\n"),
ACE_LIB_TEXT ("ACE_Asynch_Pseudo_Task::start reactor is not initialized")),
-1);
if (this->activate (THR_NEW_LWP | THR_JOINABLE, 1) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:%p\n"),
ACE_LIB_TEXT ("ACE_Asynch_Pseudo_Task::start failed")),
-1);
this->flg_active_ = 1;
return 0;
}
int
ACE_Asynch_Pseudo_Task::stop (void)
{
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0) // already stopped
return 0;
reactor_.end_reactor_event_loop ();
}
int rc = this->wait ();
if (rc != 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:%p\n"),
ACE_LIB_TEXT ("ACE_Asynch_Pseudo_Task::stop failed")),
-1);
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
this->flg_active_ = 0;
if (this->reactor_.initialized ())
this->reactor_.close ();
while (finish_count_ > 0)
{
ACE_MT (ace_mon.release ());
finish_event_.wait ();
ACE_MT (ace_mon.acquire ());
finish_event_.reset ();
}
}
return rc;
}
int
ACE_Asynch_Pseudo_Task::lock_finish (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
finish_count_ ++;
return 0;
}
int
ACE_Asynch_Pseudo_Task::unlock_finish (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
--finish_count_;
finish_event_.signal ();
return 0;
}
int
ACE_Asynch_Pseudo_Task::svc (void)
{
#if !defined (ACE_WIN32)
sigset_t RT_signals;
if (sigemptyset (&RT_signals) == -1)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("Error:(%P | %t):%p\n"),
ACE_LIB_TEXT ("sigemptyset failed")));
int member = 0;
for (int si = ACE_SIGRTMIN; si = ACE_SIGRTMAX; si++)
{
member = sigismember (& RT_signals , si);
if (member == 1)
{
sigaddset (&RT_signals, si);
}
}
if (ACE_OS::pthread_sigmask (SIG_BLOCK, &RT_signals, 0) != 0)
ACE_ERROR ((LM_ERROR,
ACE_LIB_TEXT ("Error:(%P | %t):%p\n"),
ACE_LIB_TEXT ("pthread_sigmask failed")));
#endif
reactor_.owner (ACE_Thread::self());
reactor_.run_reactor_event_loop ();
return 0;
}
int
ACE_Asynch_Pseudo_Task::register_io_handler (ACE_HANDLE handle,
ACE_Event_Handler *handler,
ACE_Reactor_Mask mask,
int flg_suspend)
{
// Return codes :
// 0 success
// -1 reactor errors
// -2 task not active
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::register_io_handler \n")
ACE_LIB_TEXT ("task not active \n")),
-2);
// Register the handler with the reactor.
int retval = this->reactor_.register_handler (handle, handler, mask);
if (retval == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::register_io_handler \n")
ACE_LIB_TEXT ("register_handler failed \n")),
-1);
if (flg_suspend == 0 )
return 0;
// Suspend the <handle> now. Enable only when the <accept> is issued
// by the application.
retval = this->reactor_.suspend_handler (handle);
if (retval == -1)
{
this->reactor_.remove_handler (handle,
ACE_Event_Handler::ALL_EVENTS_MASK
| ACE_Event_Handler::DONT_CALL);
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::register_io_handler \n")
ACE_LIB_TEXT ("suspend_handler failed \n")),
-1);
}
return 0;
}
int
ACE_Asynch_Pseudo_Task::remove_io_handler (ACE_HANDLE handle)
{
// Return codes :
// 0 success
// -1 reactor errors
// -2 task not active
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::remove_io_handler \n")
ACE_LIB_TEXT ("task not active \n")),
-2);
int retval =
this->reactor_.remove_handler (handle ,
ACE_Event_Handler::ALL_EVENTS_MASK
| ACE_Event_Handler::DONT_CALL);
if (retval == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::remove_io_handler \n")
ACE_LIB_TEXT ("remove_handler failed \n")),
-1);
return 0;
}
int
ACE_Asynch_Pseudo_Task::remove_io_handler (ACE_Handle_Set &set)
{
// Return codes :
// 0 success
// -1 reactor errors
// -2 task not active
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::remove_io_handler \n")
ACE_LIB_TEXT ("task not active \n")),
-2);
int retval =
this->reactor_.remove_handler (set ,
ACE_Event_Handler::ALL_EVENTS_MASK
| ACE_Event_Handler::DONT_CALL);
if (retval == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::remove_io_handler \n")
ACE_LIB_TEXT ("remove_handler failed \n")),
-1);
return 0;
}
int
ACE_Asynch_Pseudo_Task::suspend_io_handler (ACE_HANDLE handle)
{
// Return codes :
// 0 success
// -1 reactor errors
// -2 task not active
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::suspend_io_handler \n")
ACE_LIB_TEXT ("task not active \n")),
-2);
int retval = this->reactor_.suspend_handler (handle);
if (retval == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::suspend_io_handler \n")
ACE_LIB_TEXT ("suspend_handler failed \n")),
-1);
return 0;
}
int
ACE_Asynch_Pseudo_Task::resume_io_handler (ACE_HANDLE handle)
{
// Return codes :
// 0 success
// -1 reactor errors
// -2 task not active
ACE_MT (ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->token_, -1));
if (this->flg_active_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::resume_io_handler \n")
ACE_LIB_TEXT ("task not active \n")),
-2);
int retval = this->reactor_.resume_handler (handle);
if (retval == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%N:%l:ACE_Asynch_Pseudo_Task::resume_io_handler \n")
ACE_LIB_TEXT ("resume_handler failed \n")),
-1);
return 0;
}