Reactor.h
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* Reactor.h - I/O Multiplexer */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01k,13jul01,dbs  fix up includes
  7. 01j,16nov99,nel  Mod to get round compiler differences between T2 and T3 in
  8.                  timerAdd
  9. 01i,12aug99,aim  MT fixes
  10. 01h,09aug99,aim  change wakeup behaviour
  11. 01g,02aug99,aim  added wakeup event handler
  12. 01f,21jul99,aim  changed select parameters
  13. 01e,12jul99,aim  fix returned nHandles in select
  14. 01d,08jul99,aim  added timers
  15. 01c,07jul99,aim  added critical section protection
  16. 01b,29jun99,aim  added handler2handle map
  17. 01a,07may99,aim  created
  18. */
  19. #ifndef __INCReactor_h
  20. #define __INCReactor_h
  21. #include "ReactorTypes.h"
  22. #include "EventHandler.h"
  23. #include "HandleSet.h"
  24. #include "TimeValue.h"
  25. #include "private/comMisc.h"
  26. #include "private/comStl.h"
  27. #include "SockStream.h"
  28. #include <iostream>
  29. class Reactor
  30.     {
  31.   public:
  32.     class WakeupHandler : public EventHandler
  33. {
  34.       public:
  35. WakeupHandler (Reactor*);
  36. virtual int handleInput (REACTOR_HANDLE h);
  37. virtual REACTOR_HANDLE handleSet (REACTOR_HANDLE);
  38. virtual REACTOR_HANDLE handleGet () const;
  39. virtual int handleTimeout (const TimeValue&);
  40. int reactorWakeup ();
  41.       private:
  42. bool m_wakeupPending;
  43. VxMutex m_wakeupPendingLock;
  44. REACTOR_HANDLE m_handles[2];
  45. };
  46.     virtual ~Reactor ();
  47.     Reactor ();
  48.     void close ();
  49.     virtual int run ();
  50.     virtual int eventLoopRun ();
  51.     virtual void eventLoopEnd ();
  52.     virtual bool eventLoopDone ();
  53.     virtual int handleEvents ();
  54.     virtual int handlerAdd
  55. (
  56. EventHandler*,
  57. REACTOR_EVENT_MASK
  58. );
  59.     virtual int handlerRemove
  60. (
  61. EventHandler* eventHandler,
  62. REACTOR_EVENT_MASK mask
  63. );
  64.     virtual int handleFind
  65. (
  66. EventHandler* eventHandler,
  67. REACTOR_HANDLE& handle
  68. );
  69.     virtual int handlerFind
  70. (
  71. REACTOR_HANDLE handle,
  72. EventHandler*& eventHandler
  73. );
  74.     virtual void timerAdd
  75. (
  76. EventHandler* eventHandler,
  77. const TimeValue& timeValue
  78. );
  79.     virtual void timerRemove
  80. (
  81. EventHandler* eventHandler
  82. );
  83.     const HandleSet& rdHandles () const;
  84.     const HandleSet& wrHandles () const;
  85.     const HandleSet& exHandles () const;
  86.     static Reactor* instance ();
  87.     friend ostream& operator<< (ostream& os, const Reactor&);
  88.   private:
  89.     typedef STL_MAP (REACTOR_HANDLE, EventHandler*) Handle2HandlerMap;
  90.     typedef STL_MAP (REACTOR_HANDLE, EventHandler*)::iterator
  91. Handle2HandlerMapIter;
  92.     typedef STL_MAP (EventHandler*, REACTOR_HANDLE) Handler2HandleMap;
  93.     typedef STL_MAP (EventHandler*, REACTOR_HANDLE)::iterator
  94. Handler2HandleMapIter;
  95.     // t1 is the request timeout value, t2 is the expiring value.
  96.     typedef pair<TimeValue, TimeValue> TimerValuePair;
  97.     typedef STL_MAP (EventHandler*, TimerValuePair) TimerMap;
  98.     typedef int (EventHandler::*EventHandlerCallback) (REACTOR_HANDLE);
  99.     int handlerBind
  100. (
  101. REACTOR_HANDLE handle,
  102. REACTOR_EVENT_MASK mask
  103. );
  104.     int handlerUnbind
  105. (
  106. REACTOR_HANDLE handle,
  107. REACTOR_EVENT_MASK mask,
  108. EventHandler* eventHandler
  109. );
  110.     int dispatchFdEvents
  111. (
  112. HandleSet& rdSet,
  113. HandleSet& wrSet,
  114. HandleSet& exSet
  115. );
  116.     int dispatchFdEvents
  117. (
  118. HandleSet& selectHandles,
  119. HandleSet& reactorHandles,
  120. REACTOR_EVENT_MASK mask,
  121. EventHandlerCallback callback
  122. );
  123.     int dispatchFdEvent
  124. (
  125. HandleSet& reactorSet,
  126. REACTOR_HANDLE handle,
  127. REACTOR_EVENT_MASK mask,
  128. EventHandlerCallback callback
  129. );
  130.     int updateTimers
  131. (
  132. const TimeValue& elapsedTime
  133. );
  134.     int dispatchTimers ();
  135.     int dispatchTimer
  136. (
  137. const TimeValue& timeValue,
  138. EventHandler* eventHandler
  139. );
  140.     int nextTimerGet
  141. (
  142. TimeValue& timeValue
  143. );
  144.     int select
  145. (
  146. int nHandles,
  147. HandleSet* rdSet,
  148. HandleSet* wrSet,
  149. HandleSet* exSet,
  150. TimeValue* timeout
  151. );
  152.     int wakeup ();
  153.     
  154.     HandleSet m_rdHandles;
  155.     HandleSet m_wrHandles;
  156.     HandleSet m_exHandles;
  157.     bool m_endEventLoop;
  158.     WakeupHandler m_wakeupHandler;
  159.     Handle2HandlerMap m_handle2handlerMap;
  160.     Handler2HandleMap m_handler2handleMap;
  161.     VxMutex m_mutex; // protect internal data
  162.     TimerMap m_timerMap;
  163.     // unsupported
  164.     Reactor (const Reactor &);
  165.     Reactor& operator= (const Reactor &);
  166.     };
  167. #endif // __INCReactor_h