diff options
Diffstat (limited to 'ACE/apps/JAWS3/jaws3/Reactive_IO_Helpers.h')
-rw-r--r-- | ACE/apps/JAWS3/jaws3/Reactive_IO_Helpers.h | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/jaws3/Reactive_IO_Helpers.h b/ACE/apps/JAWS3/jaws3/Reactive_IO_Helpers.h new file mode 100644 index 00000000000..d14f6c33998 --- /dev/null +++ b/ACE/apps/JAWS3/jaws3/Reactive_IO_Helpers.h @@ -0,0 +1,308 @@ +/* -*- c++ -*- */ +// $Id$ + +#ifndef JAWS_REACTIVE_IO_HELPERS_H +#define JAWS_REACTIVE_IO_HELPERS_H + +#include "ace/Event_Handler.h" +#include "ace/Message_Block.h" +#include "ace/Singleton.h" +#include "ace/Time_Value.h" + +#include "jaws3/Export.h" +#include "jaws3/Jaws_IO.h" +#include "jaws3/Event_Result.h" +#include "jaws3/Event_Completer.h" + +class JAWS_Reactive_IO; + +class JAWS_IO_Reactive_Handler : public ACE_Event_Handler +{ + + friend class JAWS_IO_Reactive_Send; + friend class JAWS_IO_Reactive_Recv; + friend class JAWS_IO_Reactive_Transmit; + +public: + + virtual void open (void); + + int handle_timeout (const ACE_Time_Value &, const void *); + + int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + + int handle_exception (ACE_HANDLE); + + ACE_HANDLE get_handle (void) const { return this->handle_; } + + void set_handle (ACE_HANDLE handle) { this->handle_ = handle; } + +protected: + + virtual void close (int result); + +private: + + JAWS_IO_Reactive_Handler ( ACE_HANDLE handle + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + , ACE_Reactor_Mask mask + ) + : bytes_ (0) + , handle_ (handle) + , completer_ (completer) + , tv_ (tv) + , act_ (act) + , mask_ (mask) + , timer_id_ (-1) + , was_active_ (0) + { + if (ACE_Time_Value::zero < this->tv_) + this->timer_id_ = + ACE_Reactor::instance ()->schedule_timer (this, 0, this->tv_); + } + +public: // needed for destructor due to "aCC: HP ANSI C++ B3910B A.03.39" compiler bug + + ~JAWS_IO_Reactive_Handler (void) + { + if (this->timer_id_ != -1) + ACE_Reactor::instance ()->cancel_timer (this->timer_id_); + } + +private: + + JAWS_Event_Result io_result_; + + size_t bytes_; + ACE_HANDLE handle_; + JAWS_Event_Completer *completer_; + ACE_Time_Value tv_; + void *act_; + + ACE_Reactor_Mask mask_; + long timer_id_; + + int was_active_; + +}; + + +class JAWS_IO_Reactive_Send : public JAWS_IO_Reactive_Handler +{ + + friend class JAWS_Reactive_IO; + +public: + + int handle_output (ACE_HANDLE handle); + + static JAWS_IO_Reactive_Send * make ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , void *act + ) + { + return new JAWS_IO_Reactive_Send ( handle + , mb + , completer + , ACE_Time_Value::zero + , act + , ACE_Event_Handler::WRITE_MASK + ); + } + + static JAWS_IO_Reactive_Send * make ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + ) + { + return new JAWS_IO_Reactive_Send ( handle + , mb + , completer + , tv + , act + , ACE_Event_Handler::WRITE_MASK + ); + } + +private: + + JAWS_IO_Reactive_Send ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + , ACE_Reactor_Mask mask + ) + : JAWS_IO_Reactive_Handler (handle, completer, tv, act, mask) + , mb_ (mb) + { + } + +private: + + ACE_Message_Block *mb_; + +}; + + +class JAWS_IO_Reactive_Recv : public JAWS_IO_Reactive_Handler +{ + + friend class JAWS_Reactive_IO; + +public: + + int handle_input (ACE_HANDLE handle); + + static JAWS_IO_Reactive_Recv * make ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , void *act + ) + { + return new JAWS_IO_Reactive_Recv ( handle + , mb + , completer + , ACE_Time_Value::zero + , act + , ACE_Event_Handler::READ_MASK + ); + } + + static JAWS_IO_Reactive_Recv * make ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + ) + { + return new JAWS_IO_Reactive_Recv ( handle + , mb + , completer + , tv + , act + , ACE_Event_Handler::READ_MASK + ); + } + +private: + + JAWS_IO_Reactive_Recv ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + , ACE_Reactor_Mask mask + ) + : JAWS_IO_Reactive_Handler (handle, completer, tv, act, mask) + , mb_ (mb) + { + } + +private: + + ACE_Message_Block *mb_; + +}; + + +class JAWS_IO_Reactive_Transmit : public JAWS_IO_Reactive_Handler +{ + + friend class JAWS_Reactive_IO; + +public: + + int handle_timeout (const ACE_Time_Value &, const void *); + + int handle_output (ACE_HANDLE handle); + + int handle_exception (ACE_HANDLE handle); + + static JAWS_IO_Reactive_Transmit * make ( ACE_HANDLE handle + , ACE_HANDLE source + , JAWS_Event_Completer *completer + , ACE_Message_Block *header + , ACE_Message_Block *trailer + , void *act + ) + { + return new JAWS_IO_Reactive_Transmit ( handle + , source + , completer + , ACE_Time_Value::zero + , header + , trailer + , act + , ACE_Event_Handler::WRITE_MASK + ); + } + + static JAWS_IO_Reactive_Transmit * make ( ACE_HANDLE handle + , ACE_HANDLE source + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , ACE_Message_Block *header + , ACE_Message_Block *trailer + , void *act + ) + { + return new JAWS_IO_Reactive_Transmit ( handle + , source + , completer + , tv + , header + , trailer + , act + , ACE_Event_Handler::WRITE_MASK + ); + } + +protected: + + void close (int result); + + int handle_output_header (ACE_HANDLE handle); + + int handle_output_source (ACE_HANDLE handle); + + int handle_output_trailer (ACE_HANDLE handle); + + int handle_output_mb (ACE_HANDLE handle, ACE_Message_Block *&mb); + +private: + + JAWS_IO_Reactive_Transmit ( ACE_HANDLE handle + , ACE_HANDLE source + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , ACE_Message_Block *header + , ACE_Message_Block *trailer + , void *act + , ACE_Reactor_Mask mask + ) + : JAWS_IO_Reactive_Handler (handle, completer, tv, act, mask) + , source_ (source) + , source_mb_ (8 * 1024) + , source_buf_ (& this->source_mb_) + , header_ (header) + , trailer_ (trailer) + { + } + +private: + + ACE_HANDLE source_; + ACE_Message_Block source_mb_; + ACE_Message_Block *source_buf_; + ACE_Message_Block *header_; + ACE_Message_Block *trailer_; + +}; + +#endif /* JAWS_REACTIVE_IO_HELPERS_H */ |