test_end_event_loop.cpp

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

CPP
170
字号
// $Id: test_end_event_loop.cpp 78962 2007-07-20 03:27:14Z sowayaa $// ============================================================================//// = FILENAME//     test_end_event_loop.cpp//// = DESCRITPTION//     This program tests the event loop mechanism of the//     Proactor. To end the event loop, threads that are blocked in//     waiting for completions are  woken up and the event loop comes//     to the end. This is tested in this program.////     Threads are doing <run_event_loop> with/without time_out//     values and the main thread calls <end_event_loop>.//// = COMPILATION//     make//// = RUN//     ./test_end_event_loop//// = AUTHOR//     Alexander Babu Arulanthu <alex@cs.wustl.edu>//// =====================================================================#include "ace/OS_NS_unistd.h"#include "ace/Proactor.h"#include "ace/Task.h"#include "ace/WIN32_Proactor.h"#include "ace/POSIX_Proactor.h"#include "ace/OS_main.h"#if defined (ACE_HAS_WIN32_OVERLAPPED_IO) || defined (ACE_HAS_AIO_CALLS)// This only works on Win32 platforms and on Unix platforms supporting// POSIX aio calls.class My_Task: public ACE_Task <ACE_NULL_SYNCH>{  // = TITLE  //  //     Contains thread functions which execute event loops. Each  //     thread waits for a different signal.  //public:  // Constructor.  My_Task (void)    : time_flag_ (0)    {}  virtual ~My_Task (void) {}  // Destructor.  //FUZZ: disable check_for_lack_ACE_OS  // If time_flag is zero do the eventloop indefinitely, otherwise do  // it for finite amount of time (13secs!!!).  int open (void *timed_event_loop)    {  //FUZZ: enble check_for_lack_ACE_OS      // Set the local variable.      if (timed_event_loop == 0)        this->time_flag_ = 0;      else        this->time_flag_ = 1;      // Spawn the threads.      if (this->activate (THR_NEW_LWP, 5) == -1)        ACE_ERROR_RETURN ((LM_ERROR,                           "%N:%l:%p\n",                           "My_Task:open: <activate> failed"),                          -1);      return 0;    }  // Thread function.  int svc (void)    {      ACE_DEBUG ((LM_DEBUG,                  "(%P|%t):Starting svc routine\n"));      if (this->time_flag_)        {          ACE_DEBUG ((LM_DEBUG,                      "(%P|%t):Going to do *timed* <run_event_loop> \n"));          ACE_Time_Value run_time (13);          if (ACE_Proactor::instance ()->run_event_loop (run_time) == -1)            ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t):%p.\n",                               "<Proactor::run_event_loop> failed"),                              -1);        }      else        {          ACE_DEBUG ((LM_DEBUG,                      "(%P|%t):Going to do *indefinite* <run_event_loop> \n"));          if (ACE_Proactor::instance ()->run_event_loop () == -1)            ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t):%p.\n",                               "<Proactor::run_event_loop> failed"),                              -1);        }      return 0;    };private:  int time_flag_;  // If zero, indefinite event loop, otherwise timed event loop.};intACE_TMAIN (int argc, ACE_TCHAR *argv []){  ACE_UNUSED_ARG (argc);  ACE_UNUSED_ARG (argv);  ACE_DEBUG ((LM_DEBUG,              "(%P | %t):Test starts \n"));  // Let us get the singleton proactor created here. This is very  // important. This will mask the signal used in the Proactor masked  // for the main thread (and all the threads).  ACE_Proactor *proactor = ACE_Proactor::instance ();  ACE_UNUSED_ARG (proactor);  My_Task task1, task2;  // Test the indefinite run event loop.  if (task1.open (0) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "%N:%l:(%P | %t):Failed to <open> the task\n"),                      1);  // Test the indefinite run event loop. Just pass a non-zero.  if (task2.open ((void *)&task2) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "%N:%l:(%P | %t):Failed to <open> the task\n"),                      1);  // Give a gap.  ACE_OS::sleep (3);  // End the event loop.  if (ACE_Proactor::instance ()->end_event_loop () == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "%N:%l:(%P | %t):Failed to <end_event_loop>\n"),                      1);  ACE_Thread_Manager::instance ()->wait ();  ACE_DEBUG ((LM_DEBUG,              "(%P | %t):Test ends\n"));  return 0;}#else /* ACE_HAS_WIN32_OVERLAPPED_IO || ACE_HAS_AIO_CALLS */intACE_TMAIN (int, ACE_TCHAR *[]){  ACE_DEBUG ((LM_DEBUG,              "This example cannot work with AIOCB_Proactor.\n"));  return 1;}#endif /* ACE_HAS_WIN32_OVERLAPPED_IO || ACE_HAS_AIO_CALLS */

⌨️ 快捷键说明

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