handle_close.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 340 行
CPP
340 行
// $Id: Handle_Close.cpp 78962 2007-07-20 03:27:14Z sowayaa $//// ============================================================================//// = LIBRARY// examples//// = FILENAME// Handle_Close.cpp//// = DESCRIPTION//// This application tests whether handle_close gets called and if// the correct masks are passed along. The handler should get// handle_close called for all three masks (READ, WRITE, and// EXCEPT).//// = AUTHOR// Irfan Pyarali//// ============================================================================#include "ace/Get_Opt.h"#include "ace/Reactor.h"#include "ace/WFMO_Reactor.h"#include "ace/Select_Reactor.h"#include "ace/Auto_Ptr.h"#include "ace/Pipe.h"#include "ace/OS_main.h"ACE_RCSID(WFMO_Reactor, Handle_Close, "$Id: ")// Use the WFMO_Reactorstatic int opt_wfmo_reactor = 0;// Use the Select_Reactorstatic int opt_select_reactor = 0;// Make pipe readable in main()static int write_to_pipe_in_main = 0;// Cancel readsstatic int cancel_reads = 0;// Write some data to the pipe. This will cause handle_input to get// called.voidwrite_to_pipe (ACE_Pipe &pipe){ char *data = "hello"; size_t len = ACE_OS::strlen (data); ssize_t result = ACE::send (pipe.write_handle (), data, len); ACE_ASSERT ((size_t)result == len); ACE_UNUSED_ARG (result);}// Simple handler classclass Handler : public ACE_Event_Handler{public: Handler (ACE_Pipe &pipe) : pipe_ (pipe) { } ~Handler (void) { this->reactor (0); } ACE_HANDLE get_handle (void) const { return this->pipe_.read_handle (); } int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Handler::handle_close called with mask = %d\n", close_mask)); return 0; } int handle_input (ACE_HANDLE handle) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Handler::handle_input\n")); // Remove for reading return -1; } int handle_output (ACE_HANDLE handle) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Handler::handle_output\n")); // Optionally cancel reads if (cancel_reads) { int result = this->reactor ()->cancel_wakeup (this, ACE_Event_Handler::READ_MASK); ACE_ASSERT (result != -1); ACE_UNUSED_ARG (result); } // Write to the pipe; this causes handle_input to get called. if (!write_to_pipe_in_main) write_to_pipe (this->pipe_); // Remove for writing return -1; }protected: ACE_Pipe &pipe_;};class Different_Handler : public ACE_Event_Handler{public: Different_Handler (ACE_Pipe &pipe) : pipe_ (pipe) { } ~Different_Handler (void) { this->reactor (0); } ACE_HANDLE get_handle (void) const { return this->pipe_.read_handle (); } int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Different_Handler::handle_close called with mask = %d\n", close_mask)); return 0; } int handle_input (ACE_HANDLE handle) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Different_Handler::handle_input\n")); // Remove for reading int result = this->reactor ()->remove_handler (this, ACE_Event_Handler::READ_MASK); ACE_ASSERT (result == 0); ACE_UNUSED_ARG (result); return 0; } int handle_output (ACE_HANDLE handle) { ACE_UNUSED_ARG (handle); ACE_DEBUG ((LM_DEBUG, "Different_Handler::handle_output\n")); // Add for reading int result = this->reactor ()->mask_ops (this, ACE_Event_Handler::READ_MASK, ACE_Reactor::ADD_MASK); ACE_ASSERT (result != -1); ACE_Reactor_Mask old_masks = ACE_Event_Handler::WRITE_MASK | ACE_Event_Handler::EXCEPT_MASK; ACE_ASSERT (old_masks == static_cast<ACE_Reactor_Mask> (result)); ACE_UNUSED_ARG (old_masks); // Get new masks result = this->reactor ()->mask_ops (this, ACE_Event_Handler::NULL_MASK, ACE_Reactor::GET_MASK); ACE_ASSERT (result != -1); ACE_Reactor_Mask current_masks = ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK | ACE_Event_Handler::EXCEPT_MASK; ACE_ASSERT (current_masks == static_cast<ACE_Reactor_Mask> (result)); ACE_UNUSED_ARG (current_masks); // Remove for writing ACE_Reactor_Mask mask = ACE_Event_Handler::WRITE_MASK | ACE_Event_Handler::DONT_CALL; result = this->reactor ()->remove_handler (this, mask); ACE_ASSERT (result == 0); // Write to the pipe; this causes handle_input to get called. if (!write_to_pipe_in_main) write_to_pipe (this->pipe_); return 0; }protected: ACE_Pipe &pipe_;};//// Selection of which reactor should get created//ACE_Reactor *create_reactor (void){ ACE_Reactor_Impl *impl = 0; if (opt_wfmo_reactor) {#if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE) ACE_NEW_RETURN (impl, ACE_WFMO_Reactor, 0);#endif /* ACE_WIN32 */ } else if (opt_select_reactor) { ACE_NEW_RETURN (impl, ACE_Select_Reactor, 0); } else { ACE_Reactor *singleton_reactor = ACE_Reactor::instance (); ACE_Reactor::instance (0); return singleton_reactor; } ACE_Reactor *reactor = 0; ACE_NEW_RETURN (reactor, ACE_Reactor (impl, 1), 0); return reactor;}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){ int result = 0; //FUZZ: disable check_for_lack_ACE_OS // Parse args ACE_Get_Opt getopt (argc, argv, ACE_TEXT ("swmc"), 1); for (int c; (c = getopt ()) != -1; ) //FUZZ: enable check_for_lack_ACE_OS switch (c) { case 's': opt_select_reactor = 1; break; case 'w': opt_wfmo_reactor = 1; break; case 'm': write_to_pipe_in_main = 1; break; case 'c': cancel_reads = 1; break; } // Create pipes ACE_Pipe pipe1, pipe2; result = pipe1.open (); ACE_ASSERT (result == 0); result = pipe2.open (); ACE_ASSERT (result == 0); // Create handlers Handler handler (pipe1); Different_Handler different_handler (pipe2); // Manage memory automagically. auto_ptr<ACE_Reactor> reactor (create_reactor ()); // Register handlers ACE_Reactor_Mask handler_mask = ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK | ACE_Event_Handler::EXCEPT_MASK; ACE_Reactor_Mask different_handler_mask = ACE_Event_Handler::WRITE_MASK | ACE_Event_Handler::EXCEPT_MASK; result = reactor->register_handler (&handler, handler_mask); ACE_ASSERT (result == 0); result = reactor->register_handler (&different_handler, different_handler_mask); ACE_ASSERT (result == 0); // Write to the pipe; this causes handle_input to get called. if (write_to_pipe_in_main) { write_to_pipe (pipe1); write_to_pipe (pipe2); } // Note that handle_output will get called automatically since the // pipe is writable! //FUZZ: disable check_for_lack_ACE_OS // Run for three seconds ACE_Time_Value time (3); //FUZZ: enable check_for_lack_ACE_OS reactor->run_reactor_event_loop (time); ACE_DEBUG ((LM_DEBUG, "\nClosing down the application\n\n")); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?