Asynch_Pseudo_Task.cpp

Go to the documentation of this file.
00001 // $Id: Asynch_Pseudo_Task.cpp 80826 2008-03-04 14:51:23Z wotte $
00002 
00003 #include "ace/Asynch_Pseudo_Task.h"
00004 
00005 #include "ace/OS_NS_errno.h"
00006 #include "ace/OS_NS_signal.h"
00007 
00008 ACE_RCSID(ace, Asynch_Pseudo_Task, "$Id: Asynch_Pseudo_Task.cpp 80826 2008-03-04 14:51:23Z wotte $")
00009 
00010 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00011 
00012 ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task ()
00013   : select_reactor_ (),               // should be initialized before reactor_
00014     reactor_ (&select_reactor_, 0)    // don't delete implementation
00015 {
00016 }
00017 
00018 ACE_Asynch_Pseudo_Task::~ACE_Asynch_Pseudo_Task ()
00019 {
00020   this->stop ();
00021 }
00022 
00023 int
00024 ACE_Asynch_Pseudo_Task::start (void)
00025 {
00026   if (this->reactor_.initialized () == 0)
00027     ACE_ERROR_RETURN ((LM_ERROR,
00028                        ACE_TEXT ("%N:%l:%p\n"),
00029                        ACE_TEXT ("start reactor is not initialized")),
00030                        -1);
00031 
00032   return this->activate () == -1 ? -1 : 0;   // If started, return 0
00033 }
00034 
00035 int
00036 ACE_Asynch_Pseudo_Task::stop (void)
00037 {
00038   if (this->thr_count () == 0)  // already stopped
00039     return 0;
00040 
00041   if (this->reactor_.end_reactor_event_loop () == -1)
00042     return -1;
00043 
00044   this->wait ();
00045   this->reactor_.close ();
00046   return 0;
00047 }
00048 
00049 int
00050 ACE_Asynch_Pseudo_Task::svc (void)
00051 {
00052 #if !defined (ACE_WIN32)
00053 
00054   sigset_t RT_signals;
00055 
00056   sigemptyset (&RT_signals);
00057   for (int si = ACE_SIGRTMIN; si <= ACE_SIGRTMAX; si++)
00058     sigaddset (&RT_signals, si);
00059 
00060   if (ACE_OS::pthread_sigmask (SIG_BLOCK, &RT_signals, 0) != 0)
00061     ACE_ERROR ((LM_ERROR,
00062                 ACE_TEXT ("Error:(%P | %t):%p\n"),
00063                 ACE_TEXT ("pthread_sigmask")));
00064 #endif
00065 
00066   reactor_.owner (ACE_Thread::self ());
00067   reactor_.run_reactor_event_loop ();
00068 
00069   return 0;
00070 }
00071 
00072 
00073 
00074 int
00075 ACE_Asynch_Pseudo_Task::register_io_handler (ACE_HANDLE handle,
00076                                              ACE_Event_Handler *handler,
00077                                              ACE_Reactor_Mask mask,
00078                                              int flg_suspend)
00079 {
00080   // Register the handler with the reactor.
00081   if (-1 == this->reactor_.register_handler (handle, handler, mask))
00082     return -1;
00083 
00084   if (flg_suspend == 0)
00085     return 0;
00086 
00087   // Suspend the handle now. Enable only when the accept is issued
00088   // by the application.
00089   if (this->reactor_.suspend_handler (handle) == -1)
00090     {
00091       ACE_ERROR
00092         ((LM_ERROR,
00093           ACE_TEXT ("%N:%l:%p\n"),
00094           ACE_TEXT ("register_io_handler (suspended)")));
00095       this->reactor_.remove_handler (handle, ACE_Event_Handler::ALL_EVENTS_MASK
00096                                      | ACE_Event_Handler::DONT_CALL);
00097       return -1;
00098     }
00099 
00100   return 0;
00101 }
00102 
00103 int
00104 ACE_Asynch_Pseudo_Task::remove_io_handler (ACE_HANDLE handle)
00105 {
00106   return this->reactor_.remove_handler (handle,
00107                                         ACE_Event_Handler::ALL_EVENTS_MASK
00108                                         | ACE_Event_Handler::DONT_CALL);
00109 }
00110 
00111 int
00112 ACE_Asynch_Pseudo_Task::remove_io_handler (ACE_Handle_Set &set)
00113 {
00114   return this->reactor_.remove_handler (set, ACE_Event_Handler::ALL_EVENTS_MASK
00115                                         | ACE_Event_Handler::DONT_CALL);
00116 }
00117 
00118 int
00119 ACE_Asynch_Pseudo_Task::suspend_io_handler (ACE_HANDLE handle)
00120 {
00121   return this->reactor_.suspend_handler (handle);
00122 }
00123 
00124 int
00125 ACE_Asynch_Pseudo_Task::resume_io_handler (ACE_HANDLE handle)
00126 {
00127   return this->reactor_.resume_handler (handle);
00128 }
00129 
00130 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:38 2010 for ACE by  doxygen 1.4.7