]> git.tdb.fi Git - libs/core.git/blob - source/io/windows/poll.cpp
Add move semantics to Variant
[libs/core.git] / source / io / windows / poll.cpp
1 #include <msp/core/except.h>
2 #include <msp/core/systemerror.h>
3 #include "eventobject.h"
4 #include "handle.h"
5 #include "handle_private.h"
6 #include "poll.h"
7 #include "poll_platform.h"
8
9 using namespace std;
10
11 namespace Msp {
12 namespace IO {
13
14 void Poller::rebuild_array()
15 {
16         if(!objs_changed)
17                 return;
18
19         priv->handles.clear();
20         priv->handles.reserve(objects.size());
21
22         for(const PolledObject &po: objects)
23                 priv->handles.push_back(*po.object->get_event_handle());
24 }
25
26 void Poller::platform_poll(int timeout)
27 {
28         if(timeout<0)
29                 timeout = INFINITE;
30
31         DWORD ret = WaitForMultipleObjects(priv->handles.size(), &priv->handles.front(), false, timeout);
32         if(/*ret>=WAIT_OBJECT_0 &&*/ ret<WAIT_OBJECT_0+priv->handles.size())
33         {
34                 const PolledObject &obj = objects[ret-WAIT_OBJECT_0];
35                 poll_result.push_back(obj);
36         }
37         else if(ret==WAIT_FAILED)
38                 throw system_error("WaitForMultipleObjects");
39 }
40
41
42 PollEvent platform_poll(EventObject &obj, PollEvent pe, int timeout)
43 {
44         if(timeout<0)
45                 timeout = INFINITE;
46
47         DWORD ret = WaitForSingleObject(*obj.get_event_handle(), timeout);
48         if(ret==WAIT_OBJECT_0)
49                 return pe;
50         else if(ret==WAIT_FAILED)
51                 throw system_error("WaitForSingleObject");
52
53         return P_NONE;
54 }
55
56 } // namespace IO
57 } // namespace Msp