summaryrefslogtreecommitdiff
path: root/ace/Msg_WFMO_Reactor.cpp
blob: ded0e200926200e5231bd2014854010afb8cde61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// $Id$

#include "ace/Msg_WFMO_Reactor.h"

ACE_RCSID(ace, Msg_WFMO_Reactor, "$Id$")

#if defined (ACE_WIN32) && !defined (ACE_LACKS_MSG_WFMO)

#if !defined (__ACE_INLINE__)
#include "ace/Msg_WFMO_Reactor.i"
#endif /* __ACE_INLINE__ */

ACE_Msg_WFMO_Reactor::ACE_Msg_WFMO_Reactor (ACE_Sig_Handler *sh, 
                                            ACE_Timer_Queue *tq)
  : ACE_WFMO_Reactor (sh, tq)
{
}

ACE_Msg_WFMO_Reactor::ACE_Msg_WFMO_Reactor (size_t size,
                                            int unused,
                                            ACE_Sig_Handler *sh,
                                            ACE_Timer_Queue *tq)
  : ACE_WFMO_Reactor (size, unused, sh, tq)
{
}

ACE_Msg_WFMO_Reactor::~ACE_Msg_WFMO_Reactor (void)
{
}

int
ACE_Msg_WFMO_Reactor::wait_for_multiple_events (int timeout,
                                                int alertable)
{
  // Wait for any of handles_ to be active, or until timeout expires.
  // If <alertable> is enabled allow asynchronous completion of
  // ReadFile and WriteFile operations. QS_ALLINPUT allows
  // <MsgWaitForMultipleObjectsEx> to wait for any message is in the
  // queue.
#if (defined (ACE_HAS_WINNT4) && (ACE_HAS_WINNT4 != 0))
  return ::MsgWaitForMultipleObjectsEx (this->handler_rep_.max_handlep1 (),
                                        this->handler_rep_.handles (),
                                        timeout,
                                        QS_ALLINPUT,
                                        alertable);
#else
  ACE_UNUSED_ARG (alertable);
  return ::MsgWaitForMultipleObjects (this->handler_rep_.max_handlep1 (),
                                      this->handler_rep_.handles (),
                                      FALSE,
                                      timeout,
                                      QS_ALLINPUT);
#endif /* (defined (ACE_HAS_WINNT4) && (ACE_HAS_WINNT4 != 0)) */
}

int
ACE_Msg_WFMO_Reactor::dispatch_window_messages (void)
{
  int number_of_messages = 0;
  MSG msg;
      
  // Process all pending message from this thread's message queue
  while (::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
    {
      ::TranslateMessage (&msg);
      if (msg.message == WM_QUIT)
        {
          // Should inform the main thread
          ::PostQuitMessage (msg.wParam); 
          return -1;
        }
      
      ::DispatchMessage (&msg);
      number_of_messages++;
    }
  
  return number_of_messages;
}

DWORD
ACE_Msg_WFMO_Reactor::poll_remaining_handles (size_t slot)
{
  return ::MsgWaitForMultipleObjects (this->handler_rep_.max_handlep1 () - slot,
                                      this->handler_rep_.handles () + slot,
                                      FALSE,
                                      0,
                                      QS_ALLINPUT);
}

#endif /* ACE_WIN32 && !ACE_LACKS_MSG_WFMO */