abandoned.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 142 行

CPP
142
字号
// $Id: Abandoned.cpp 56416 2004-03-14 12:44:31Z jwillemsen $// ============================================================================//// = LIBRARY//    examples//// = FILENAME//    Abandoned.cpp//// = DESCRIPTION////    Tests the WFMO_Reactor's ability to handle abandoned mutexes.//// = AUTHOR////    Irfan Pyarali <irfan@cs.wustl.edu>//// ============================================================================#include "ace/OS_main.h"#if defined (ACE_WIN32)#include "ace/Reactor.h"#include "ace/Thread_Manager.h"#include "ace/Process_Mutex.h"#include "ace/Auto_Event.h"ACE_RCSID(WFMO_Reactor, Abandoned, "$Id: Abandoned.cpp 56416 2004-03-14 12:44:31Z jwillemsen $")class Event_Handler : public ACE_Event_Handler{public:  int handle_signal (int signum,                     siginfo_t * = 0,                     ucontext_t * = 0);  int handle_timeout (const ACE_Time_Value &tv,                      const void *arg = 0);  ACE_Auto_Event handle_;  ACE_Process_Mutex *mutex_;  int iterations_;};static int abandon = 1;static ACE_THR_FUNC_RETURNworker (void *data){  Event_Handler *handler = (Event_Handler *) data;  handler->handle_.signal ();  handler->mutex_->acquire ();  if (!abandon)    handler->mutex_->release ();  return 0;}intEvent_Handler::handle_signal (int,                              siginfo_t *s,                              ucontext_t *){  ACE_HANDLE handle = s->si_handle_;  if (handle == this->handle_.handle ())    ACE_Reactor::instance ()->register_handler (this,                                                this->mutex_->lock ().proc_mutex_);  else    {      ACE_Reactor::instance ()->remove_handler (this->mutex_->lock ().proc_mutex_,                                                ACE_Event_Handler::DONT_CALL);      delete this->mutex_;    }  return 0;}intEvent_Handler::handle_timeout (const ACE_Time_Value &,                               const void *){  --this->iterations_;  ACE_DEBUG ((LM_DEBUG,              "(%t) timeout occured @ %T, iterations left %d\n",              this->iterations_));  if (this->iterations_ == 0)    {      ACE_Reactor::instance ()->remove_handler (this->handle_.handle (),                                                ACE_Event_Handler::DONT_CALL);      ACE_Reactor::instance ()->cancel_timer (this);      ACE_Reactor::end_event_loop ();    }  else    {      ACE_NEW_RETURN (this->mutex_,                      ACE_Process_Mutex,                      -1);      int result = ACE_Thread_Manager::instance ()->spawn (&worker, this);      ACE_ASSERT (result != -1);      ACE_UNUSED_ARG (result);    }  return 0;}intACE_TMAIN (int , ACE_TCHAR *[]){  Event_Handler event_handler;  event_handler.iterations_ = 5;  int result = ACE_Reactor::instance ()->register_handler    (&event_handler,     event_handler.handle_.handle ());  ACE_ASSERT (result == 0);  ACE_Time_Value timeout (2);  result = ACE_Reactor::instance ()->schedule_timer (&event_handler,                                                     0,                                                     timeout,                                                     timeout);  ACE_ASSERT (result != -1);  ACE_Reactor::run_event_loop ();  return 0;}#else /* !ACE_WIN32 */intACE_TMAIN (int , ACE_TCHAR *[]){  return 0;}#endif /* ACE_WIN32 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?