forked from zeromq/clrzmq4
-
Notifications
You must be signed in to change notification settings - Fork 4
/
ZPollItems.Posix.cs
98 lines (81 loc) · 2.36 KB
/
ZPollItems.Posix.cs
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
91
92
93
94
95
96
97
98
namespace ZeroMQ
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using lib;
public static partial class ZPollItems // : IDisposable, IList<ZmqPollItem>
{
public static class Posix
{
unsafe internal static bool PollMany(
IEnumerable<ZSocket> sockets,
IEnumerable<ZPollItem> items, ZPoll pollEvents,
out ZError error, TimeSpan? timeout = null)
{
error = default(ZError);
bool result = false;
int count = items.Count();
int timeoutMs = !timeout.HasValue ? -1 : (int)timeout.Value.TotalMilliseconds;
zmq_pollitem_posix_t* natives = stackalloc zmq_pollitem_posix_t[count];
// fixed (zmq_pollitem_posix_t* natives = managedArray) {
for (int i = 0; i < count; ++i)
{
ZSocket socket = sockets.ElementAt(i);
ZPollItem item = items.ElementAt(i);
zmq_pollitem_posix_t* native = natives + i;
native->SocketPtr = socket.SocketPtr;
native->Events = (short)(item.Events & pollEvents);
native->ReadyEvents = (short)ZPoll.None;
}
while (!(result = (-1 != zmq.poll(natives, count, timeoutMs))))
{
error = ZError.GetLastErr();
if (error == ZError.EINTR)
{
error = default(ZError);
continue;
}
break;
}
for (int i = 0; i < count; ++i)
{
ZPollItem item = items.ElementAt(i);
zmq_pollitem_posix_t* native = natives + i;
item.ReadyEvents = (ZPoll)native->ReadyEvents;
}
// }
return result;
}
unsafe internal static bool PollSingle(
ZSocket socket,
ZPollItem item, ZPoll pollEvents,
out ZError error, TimeSpan? timeout = null)
{
error = default(ZError);
bool result = false;
int timeoutMs = !timeout.HasValue ? -1 : (int)timeout.Value.TotalMilliseconds;
zmq_pollitem_posix_t* native = stackalloc zmq_pollitem_posix_t[1];
// fixed (zmq_pollitem_posix_t* native = managedArray) {
native->SocketPtr = socket.SocketPtr;
native->Events = (short)(item.Events & pollEvents);
native->ReadyEvents = (short)ZPoll.None;
while (!(result = (-1 != zmq.poll(native, 1, timeoutMs))))
{
error = ZError.GetLastErr();
if (error == ZError.EINTR)
{
error = default(ZError);
continue;
}
break;
}
item.ReadyEvents = (ZPoll)native->ReadyEvents;
//}
return result;
}
}
}
}