summaryrefslogtreecommitdiff
path: root/ace/ReactorEx.h
diff options
context:
space:
mode:
Diffstat (limited to 'ace/ReactorEx.h')
-rw-r--r--ace/ReactorEx.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/ace/ReactorEx.h b/ace/ReactorEx.h
new file mode 100644
index 00000000000..3b1bcc84a4b
--- /dev/null
+++ b/ace/ReactorEx.h
@@ -0,0 +1,231 @@
+/* -*- C++ -*- */
+// $Id$
+
+
+// ============================================================================
+//
+// = LIBRARY
+// ace
+//
+// = FILENAME
+// ReactorEx.h
+//
+// = AUTHOR
+// Tim Harrison and Doug Schmidt
+//
+// ============================================================================
+
+#if !defined (ACE_ReactorEx_H)
+#define ACE_ReactorEx_H
+
+#include "ace/Timer_Queue.h"
+#include "ace/Time_Value.h"
+#include "ace/Event_Handler.h"
+#include "ace/Token.h"
+
+#if defined (ACE_MT_SAFE)
+
+#if defined (ACE_REACTOREX_HAS_DEADLOCK_DETECTION)
+#include "ace/Local_Tokens.h"
+typedef ACE_Local_Mutex ACE_REACTOREX_MUTEX;
+#else
+typedef ACE_Token ACE_REACTOREX_MUTEX;
+#endif /* ACE_REACTOR_HAS_DEADLOCK_DETECTION */
+
+// Forward decl.
+class ACE_ReactorEx;
+
+class ACE_Export ACE_ReactorEx_Token : public ACE_REACTOREX_MUTEX
+{
+public:
+ ACE_ReactorEx_Token (ACE_ReactorEx &r);
+
+ virtual void sleep_hook (void);
+ // Called just before the ACE_Event_Handler goes to sleep.
+
+ void dump (void) const;
+ // Dump the state of an object.
+
+ ACE_ALLOC_HOOK_DECLARE;
+ // Declare the dynamic allocation hooks.
+
+private:
+ ACE_ReactorEx &reactorEx_;
+};
+
+#endif /* ACE_MT_SAFE */
+
+#if defined (ACE_WIN32)
+// ************************************************************
+
+class ACE_Export ACE_ReactorEx_Notify : public ACE_Event_Handler
+// = TITLE
+// ReactorEx Notify
+//
+// = DESCRIPTION
+// A "do-nothing" class that is called when ReactorEx::notify is
+// called.
+{
+public:
+ ACE_ReactorEx_Notify (void);
+ // Creates a handle.
+
+ ~ACE_ReactorEx_Notify (void);
+ // Destroys a handle.
+
+ int notify (void);
+ // Signals a handle.
+
+private:
+ virtual ACE_HANDLE get_handle (void) const;
+ // Returns a handle.
+
+ virtual int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0);
+ // Does nothing with a handle.
+
+ ACE_HANDLE handle_;
+ // A handle.
+};
+
+class ACE_Export ACE_ReactorEx
+ // = TITLE
+ // An object oriented event demultiplexor and event handler
+ // ReactorEx for Win32 WaitForMultipleObjects
+ //
+ // = DESCRIPTION
+
+ // The ACE_ReactorEx is an object-oriented event demultiplexor
+ // and event handler ReactorEx. The sources of events that the
+ // ACE_ReactorEx waits for and dispatches includes I/O events,
+ // general Win32 synchronization events (such as mutexes,
+ // semaphores, threads, etc.) and timer events.
+{
+public:
+ enum
+ {
+ MAX_SIZE = MAXIMUM_WAIT_OBJECTS,
+ // Default size of the ReactorEx's handle table.
+ };
+
+ // = Initialization and termination methods.
+
+ ACE_ReactorEx (void);
+ // Initialize the new ACE_ReactorEx with the default size.
+
+ virtual ~ACE_ReactorEx (void);
+ // Close down the ReactorEx and release all of its resources.
+
+ // = Event loop drivers.
+ // Main event loop driver that blocks for -how_long- before
+ // returning (will return earlier if I/O or signal events occur).
+ // Note that -how_long- can be 0, in which case this method blocks
+ // until I/O events or signals occur. Returns 0 if timed out, 1 if
+ // an event occurred, and -1 if an error occured.
+ virtual int handle_events (ACE_Time_Value *how_long = 0,
+ int wait_all = 0);
+ virtual int handle_events (ACE_Time_Value &how_long,
+ int wait_all = 0);
+
+
+ // = Register and remove Handlers.
+ virtual int register_handler (ACE_Event_Handler *eh,
+ ACE_HANDLE handle = ACE_INVALID_HANDLE);
+ // Register an Event_Handler -eh-. If handle == ACE_INVALID_HANDLE
+ // the ReactorEx will call eh->get_handle() to extract the
+ // underlying I/O handle).
+
+ virtual int remove_handler (ACE_Event_Handler *eh,
+ ACE_Reactor_Mask mask = 0);
+ // Removes -eh- from the ReactorEx. Note that the ReactorEx will
+ // call eh->get_handle() to extract the underlying I/O handle. If
+ // -mask- == ACE_Event_Handler::DONT_CALL then the -handle_close-
+ // method of the -eh- is not invoked.
+
+ virtual int notify (void);
+ // Wakeup ACE_ReactorEx if currently blocked
+ // WaitForMultipleObjects.
+
+ // = Timer management.
+ virtual int schedule_timer (ACE_Event_Handler *eh,
+ const void *arg,
+ const ACE_Time_Value &delta,
+ const ACE_Time_Value &interval = ACE_Time_Value::zero);
+ // Schedule an Event Handler -eh- that will expire after -delta-
+ // amount of time. If it expires then -arg- is passed in as the
+ // value to eh->handle_timeout. If -interval- is != to
+ // ACE_Time_Value::zero then it is used to reschedule -eh-
+ // automatically. This method returns a timer handle that uniquely
+ // identifies the -eh- in an internal list. This timer handle can
+ // be used to cancel an Event_Handler before it expires. The
+ // cancellation ensures that timer_ids are unique up to values of
+ // greater than 2 billion timers. As long as timers don't stay
+ // around longer than this there should be no problems with
+ // accidentally deleting the wrong timer.
+
+ virtual int cancel_timer (ACE_Event_Handler *event_handler);
+ // Cancel all Event_Handlers that match the address of
+ // -event_handler-.
+
+ virtual int cancel_timer (int timer_id, const void **arg = 0);
+ // Cancel the single Event_Handler that matches the -timer_id- value
+ // (which was returned from the schedule method). If arg is
+ // non-NULL then it will be set to point to the ``magic cookie''
+ // argument passed in when the Event_Handler was registered. This
+ // makes it possible to free up the memory and avoid memory leaks.
+
+ void dump (void) const;
+ // Dump the state of an object.
+
+ ACE_ALLOC_HOOK_DECLARE;
+ // Declare the dynamic allocation hooks.
+
+protected:
+ int handle_notification (void);
+ // Handle the case where some thread has awakened us via our
+ // notification event.
+
+ ACE_Timer_Queue timer_queue_;
+ // Defined as a pointer to allow overriding by derived classes...
+
+ ACE_Time_Value timer_skew_;
+ // Adjusts for timer skew in various clocks.
+
+ ACE_HANDLE handles_[MAX_SIZE];
+ // Array of handles passed to WaitForMultipleObjects.
+
+ ACE_Event_Handler *handlers_[MAX_SIZE];
+ // Array of Event_Handler pointers that store the handlers to
+ // dispatch when the corresponding handles_ entry becomes signaled.
+
+ size_t active_handles_;
+ // Number of handles that are currently active (ranges between 0 and
+ // MAX_SIZE).
+
+ ACE_ReactorEx_Token token_;
+ // Synchronization token for the MT_SAFE ACE_Reactor.
+
+private:
+
+ // Deny access since member-wise won't work...
+ ACE_ReactorEx (const ACE_ReactorEx &);
+ ACE_ReactorEx &operator = (const ACE_ReactorEx &);
+
+ ACE_ReactorEx_Notify notify_handler_;
+ // Called when notify is called.
+};
+
+#else /* NOT win32 */
+class ACE_Export ACE_ReactorEx
+{
+public:
+ virtual int handle_events (void) { return -1; }
+ virtual int handle_events (ACE_Time_Value &) { return -1; }
+ virtual int notify (void) { return 0; }
+};
+
+#endif /* ACE_WIN32 */
+
+#if defined (__ACE_INLINE__)
+#include "ace/ReactorEx.i"
+#endif /* __ACE_INLINE__ */
+#endif /* ACE_ReactorEx_H */