rbczmq 1.7.4 → 1.7.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.travis.yml +4 -1
- data/CHANGELOG.rdoc +13 -0
- data/Gemfile +8 -1
- data/Gemfile.lock +211 -2
- data/README.rdoc +7 -4
- data/ext/rbczmq/beacon.c +6 -3
- data/ext/rbczmq/context.c +117 -8
- data/ext/rbczmq/context.h +5 -0
- data/ext/rbczmq/message.c +6 -4
- data/ext/rbczmq/poller.c +12 -5
- data/ext/rbczmq/rbczmq_ext.c +2 -0
- data/ext/rbczmq/rbczmq_ext.h +1 -0
- data/ext/rbczmq/socket.c +135 -59
- data/ext/rbczmq/socket.h +2 -0
- data/ext/zeromq/CMakeLists.txt +3 -1
- data/ext/zeromq/NEWS +28 -3
- data/ext/zeromq/doc/zmq.txt +3 -3
- data/ext/zeromq/doc/zmq_getsockopt.txt +3 -3
- data/ext/zeromq/doc/zmq_msg_get.txt +2 -1
- data/ext/zeromq/doc/zmq_msg_more.txt +1 -1
- data/ext/zeromq/doc/zmq_setsockopt.txt +18 -19
- data/ext/zeromq/doc/zmq_socket.txt +4 -0
- data/ext/zeromq/include/zmq.h +14 -18
- data/ext/zeromq/src/clock.cpp +57 -2
- data/ext/zeromq/src/ctx.cpp +11 -5
- data/ext/zeromq/src/devpoll.cpp +5 -0
- data/ext/zeromq/src/devpoll.hpp +2 -0
- data/ext/zeromq/src/epoll.cpp +5 -0
- data/ext/zeromq/src/epoll.hpp +2 -0
- data/ext/zeromq/src/i_engine.hpp +2 -2
- data/ext/zeromq/src/kqueue.cpp +5 -0
- data/ext/zeromq/src/kqueue.hpp +2 -0
- data/ext/zeromq/src/pgm_receiver.cpp +2 -2
- data/ext/zeromq/src/pgm_receiver.hpp +2 -2
- data/ext/zeromq/src/pgm_sender.cpp +2 -2
- data/ext/zeromq/src/pgm_sender.hpp +2 -2
- data/ext/zeromq/src/poll.cpp +5 -0
- data/ext/zeromq/src/poll.hpp +2 -0
- data/ext/zeromq/src/router.cpp +2 -0
- data/ext/zeromq/src/select.cpp +5 -0
- data/ext/zeromq/src/select.hpp +2 -0
- data/ext/zeromq/src/session_base.cpp +2 -2
- data/ext/zeromq/src/signaler.cpp +73 -99
- data/ext/zeromq/src/signaler.hpp +2 -2
- data/ext/zeromq/src/socket_base.cpp +42 -40
- data/ext/zeromq/src/stream_engine.cpp +60 -58
- data/ext/zeromq/src/stream_engine.hpp +7 -8
- data/ext/zeromq/src/zmq_utils.cpp +6 -5
- data/ext/zeromq/tests/Makefile.am +6 -5
- data/ext/zeromq/tests/test_conflate.cpp +2 -5
- data/ext/zeromq/tests/test_ctx_destroy.cpp +1 -1
- data/ext/zeromq/tests/test_ctx_options.cpp +1 -1
- data/ext/zeromq/tests/test_immediate.cpp +1 -2
- data/ext/zeromq/tests/test_inproc_connect.cpp +1 -1
- data/ext/zeromq/tests/test_iov.cpp +1 -1
- data/ext/zeromq/tests/test_many_sockets.cpp +90 -0
- data/ext/zeromq/tests/test_monitor.cpp +3 -3
- data/ext/zeromq/tests/test_req_relaxed.cpp +1 -1
- data/ext/zeromq/tests/test_router_raw_empty.cpp +65 -0
- data/ext/zeromq/tests/test_spec_req.cpp +1 -1
- data/ext/zeromq/tests/test_stream.cpp +6 -7
- data/ext/zeromq/tests/test_sub_forward.cpp +1 -1
- data/ext/zeromq/tests/test_term_endpoint.cpp +2 -2
- data/ext/zeromq/tests/testutil.hpp +18 -1
- data/ext/zeromq/tools/Makefile.am +1 -1
- data/lib/zmq/socket.rb +1 -0
- data/lib/zmq/socket/stream.rb +44 -0
- data/lib/zmq/version.rb +1 -1
- data/test/socket/test_dealer_socket.rb +1 -1
- data/test/socket/test_pair_socket.rb +1 -1
- data/test/socket/test_pair_sockets.rb +1 -1
- data/test/socket/test_pub_socket.rb +1 -1
- data/test/socket/test_pub_sub_sockets.rb +1 -1
- data/test/socket/test_pull_socket.rb +1 -1
- data/test/socket/test_push_pull_sockets.rb +1 -1
- data/test/socket/test_push_socket.rb +1 -1
- data/test/socket/test_rep_socket.rb +1 -1
- data/test/socket/test_req_rep_sockets.rb +1 -1
- data/test/socket/test_req_socket.rb +1 -1
- data/test/socket/test_router_socket.rb +1 -1
- data/test/socket/test_routing.rb +1 -1
- data/test/socket/test_stream_socket.rb +74 -0
- data/test/socket/test_sub_socket.rb +1 -1
- data/test/test_beacon.rb +4 -2
- data/test/test_context.rb +2 -2
- data/test/test_frame.rb +2 -2
- data/test/test_handler.rb +2 -2
- data/test/test_logger.rb +1 -1
- data/test/test_loop.rb +2 -2
- data/test/test_message.rb +1 -1
- data/test/test_monitoring.rb +15 -3
- data/test/test_poller.rb +2 -2
- data/test/test_pollitem.rb +2 -2
- data/test/test_socket.rb +53 -6
- data/test/test_threading.rb +2 -2
- data/test/test_timer.rb +2 -2
- data/test/test_zmq.rb +2 -2
- metadata +109 -104
@@ -45,7 +45,6 @@ int main (int argc, char *argv [])
|
|
45
45
|
assert (rc == 0);
|
46
46
|
|
47
47
|
int message_count = 20;
|
48
|
-
|
49
48
|
for (int j = 0; j < message_count; ++j) {
|
50
49
|
rc = zmq_send(s_out, (void*)&j, sizeof(int), 0);
|
51
50
|
if (rc < 0) {
|
@@ -53,15 +52,13 @@ int main (int argc, char *argv [])
|
|
53
52
|
return -1;
|
54
53
|
}
|
55
54
|
}
|
56
|
-
|
57
|
-
zmq_sleep (1);
|
55
|
+
msleep (SETTLE_TIME);
|
58
56
|
|
59
57
|
int payload_recved = 0;
|
60
|
-
rc = zmq_recv(s_in, (void*)&payload_recved, sizeof(int), 0);
|
58
|
+
rc = zmq_recv (s_in, (void*)&payload_recved, sizeof(int), 0);
|
61
59
|
assert (rc > 0);
|
62
60
|
assert (payload_recved == message_count - 1);
|
63
61
|
|
64
|
-
|
65
62
|
rc = zmq_close (s_in);
|
66
63
|
assert (rc == 0);
|
67
64
|
|
@@ -61,7 +61,7 @@ void test_ctx_shutdown()
|
|
61
61
|
void *receiver_thread = zmq_threadstart (&receiver, socket);
|
62
62
|
|
63
63
|
// Wait for thread to start up and block
|
64
|
-
|
64
|
+
msleep (SETTLE_TIME);
|
65
65
|
|
66
66
|
// Shutdown context, if we used destroy here we would deadlock.
|
67
67
|
rc = zmq_ctx_shutdown (ctx);
|
@@ -33,7 +33,7 @@ int main (void)
|
|
33
33
|
assert (zmq_ctx_get (ctx, ZMQ_IPV6) == 0);
|
34
34
|
|
35
35
|
rc = zmq_ctx_set (ctx, ZMQ_IPV6, true);
|
36
|
-
assert (zmq_ctx_get (ctx, ZMQ_IPV6) ==
|
36
|
+
assert (zmq_ctx_get (ctx, ZMQ_IPV6) == 1);
|
37
37
|
|
38
38
|
void *router = zmq_socket (ctx, ZMQ_ROUTER);
|
39
39
|
int ipv6;
|
@@ -193,8 +193,7 @@ int main (void)
|
|
193
193
|
assert (rc == 0);
|
194
194
|
|
195
195
|
// Give time to process disconnect
|
196
|
-
|
197
|
-
zmq_sleep(1);
|
196
|
+
msleep (SETTLE_TIME);
|
198
197
|
|
199
198
|
// Send a message, should fail
|
200
199
|
rc = zmq_send (frontend, "Hello", 5, ZMQ_DONTWAIT);
|
@@ -142,7 +142,7 @@ void test_connect_before_bind_pub_sub()
|
|
142
142
|
assert (rc == 0);
|
143
143
|
|
144
144
|
// Wait for pub-sub connection to happen
|
145
|
-
|
145
|
+
msleep (SETTLE_TIME);
|
146
146
|
|
147
147
|
// Queue up some data, this not will be dropped
|
148
148
|
rc = zmq_send_const (connectSocket, "after", 6, 0);
|
@@ -0,0 +1,90 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
|
3
|
+
|
4
|
+
This file is part of 0MQ.
|
5
|
+
|
6
|
+
0MQ is free software; you can redistribute it and/or modify it under
|
7
|
+
the terms of the GNU Lesser General Public License as published by
|
8
|
+
the Free Software Foundation; either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
0MQ is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public License
|
17
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "testutil.hpp"
|
21
|
+
#include <zmq.h>
|
22
|
+
#include <stdio.h>
|
23
|
+
#include <stdlib.h>
|
24
|
+
#include <vector>
|
25
|
+
|
26
|
+
void test_system_max ()
|
27
|
+
{
|
28
|
+
// Keep allocating sockets until we run out of system resources
|
29
|
+
const int no_of_sockets = 2 * 65536;
|
30
|
+
void *ctx = zmq_ctx_new ();
|
31
|
+
zmq_ctx_set (ctx, ZMQ_MAX_SOCKETS, no_of_sockets);
|
32
|
+
std::vector <void*> sockets;
|
33
|
+
|
34
|
+
while (true) {
|
35
|
+
void *socket = zmq_socket (ctx, ZMQ_PAIR);
|
36
|
+
if (!socket)
|
37
|
+
break;
|
38
|
+
sockets.push_back (socket);
|
39
|
+
}
|
40
|
+
assert ((int) sockets.size () < no_of_sockets);
|
41
|
+
|
42
|
+
// System is out of resources, further calls to zmq_socket should return NULL
|
43
|
+
for (unsigned int i = 0; i < 10; ++i) {
|
44
|
+
void *socket = zmq_socket (ctx, ZMQ_PAIR);
|
45
|
+
assert (socket == NULL);
|
46
|
+
}
|
47
|
+
// Clean up.
|
48
|
+
for (unsigned int i = 0; i < sockets.size (); ++i)
|
49
|
+
zmq_close (sockets [i]);
|
50
|
+
|
51
|
+
zmq_ctx_destroy (ctx);
|
52
|
+
}
|
53
|
+
|
54
|
+
void test_zmq_default_max ()
|
55
|
+
{
|
56
|
+
// Keep allocating sockets until we hit the default limit
|
57
|
+
void *ctx = zmq_ctx_new ();
|
58
|
+
std::vector<void*> sockets;
|
59
|
+
|
60
|
+
while (true) {
|
61
|
+
void *socket = zmq_socket (ctx, ZMQ_PAIR);
|
62
|
+
if (!socket)
|
63
|
+
break;
|
64
|
+
sockets.push_back (socket);
|
65
|
+
}
|
66
|
+
// We may stop sooner if system has fewer available sockets
|
67
|
+
assert (sockets.size () <= ZMQ_MAX_SOCKETS_DFLT);
|
68
|
+
|
69
|
+
// Further calls to zmq_socket should return NULL
|
70
|
+
for (unsigned int i = 0; i < 10; ++i) {
|
71
|
+
void *socket = zmq_socket (ctx, ZMQ_PAIR);
|
72
|
+
assert (socket == NULL);
|
73
|
+
}
|
74
|
+
|
75
|
+
// Clean up
|
76
|
+
for (unsigned int i = 0; i < sockets.size (); ++i)
|
77
|
+
zmq_close (sockets [i]);
|
78
|
+
|
79
|
+
zmq_ctx_destroy (ctx);
|
80
|
+
}
|
81
|
+
|
82
|
+
int main (void)
|
83
|
+
{
|
84
|
+
setup_test_environment ();
|
85
|
+
|
86
|
+
test_system_max ();
|
87
|
+
test_zmq_default_max ();
|
88
|
+
|
89
|
+
return 0;
|
90
|
+
}
|
@@ -211,7 +211,7 @@ int main (void)
|
|
211
211
|
rc = zmq_socket_monitor (req, "inproc://monitor.req", ZMQ_EVENT_ALL);
|
212
212
|
assert (rc == 0);
|
213
213
|
threads [1] = zmq_threadstart(&req_socket_monitor, ctx);
|
214
|
-
|
214
|
+
msleep (SETTLE_TIME);
|
215
215
|
|
216
216
|
// Bind REQ and REP
|
217
217
|
rc = zmq_bind (rep, addr.c_str());
|
@@ -238,8 +238,8 @@ int main (void)
|
|
238
238
|
rc = zmq_close (rep);
|
239
239
|
assert (rc == 0);
|
240
240
|
|
241
|
-
// Allow
|
242
|
-
|
241
|
+
// Allow enough time for detecting error states
|
242
|
+
msleep (250);
|
243
243
|
|
244
244
|
// Close the REQ socket
|
245
245
|
rc = zmq_close (req);
|
@@ -54,7 +54,7 @@ int main (void)
|
|
54
54
|
// We have to give the connects time to finish otherwise the requests
|
55
55
|
// will not properly round-robin. We could alternatively connect the
|
56
56
|
// REQ sockets to the REP sockets.
|
57
|
-
|
57
|
+
msleep (SETTLE_TIME);
|
58
58
|
|
59
59
|
// Case 1: Second send() before a reply arrives in a pipe.
|
60
60
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
|
3
|
+
|
4
|
+
This file is part of 0MQ.
|
5
|
+
|
6
|
+
0MQ is free software; you can redistribute it and/or modify it under
|
7
|
+
the terms of the GNU Lesser General Public License as published by
|
8
|
+
the Free Software Foundation; either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
0MQ is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public License
|
17
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "testutil.hpp"
|
21
|
+
|
22
|
+
int main (void) {
|
23
|
+
setup_test_environment();
|
24
|
+
void *ctx = zmq_ctx_new();
|
25
|
+
assert(ctx);
|
26
|
+
|
27
|
+
void *router = zmq_socket(ctx, ZMQ_ROUTER);
|
28
|
+
assert(router);
|
29
|
+
void *dealer = zmq_socket(ctx, ZMQ_DEALER);
|
30
|
+
assert(dealer);
|
31
|
+
|
32
|
+
int one=1;
|
33
|
+
int rc = zmq_setsockopt(router, ZMQ_ROUTER_RAW, &one, sizeof(int));
|
34
|
+
assert(rc >= 0);
|
35
|
+
rc = zmq_setsockopt(router, ZMQ_ROUTER_MANDATORY, &one, sizeof(int));
|
36
|
+
assert(rc >= 0);
|
37
|
+
|
38
|
+
rc = zmq_bind(router, "tcp://127.0.0.1:5555");
|
39
|
+
rc = zmq_connect(dealer, "tcp://127.0.0.1:5555");
|
40
|
+
zmq_send(dealer, "", 0, 0);
|
41
|
+
|
42
|
+
|
43
|
+
zmq_msg_t ident, empty;
|
44
|
+
zmq_msg_init(&ident);
|
45
|
+
rc = zmq_msg_recv(&ident, router, 0);
|
46
|
+
assert(rc >= 0);
|
47
|
+
rc = zmq_msg_init_data(&empty, (void*)"", 0, NULL, NULL);
|
48
|
+
assert(rc >= 0);
|
49
|
+
|
50
|
+
rc = zmq_msg_send(&ident, router, ZMQ_SNDMORE);
|
51
|
+
assert(rc >= 0);
|
52
|
+
rc = zmq_msg_close(&ident);
|
53
|
+
assert(rc >= 0);
|
54
|
+
|
55
|
+
rc = zmq_msg_send(&empty, router, 0);
|
56
|
+
assert(rc >= 0);
|
57
|
+
|
58
|
+
// This close used to fail with Bad Address
|
59
|
+
rc = zmq_msg_close(&empty);
|
60
|
+
assert(rc >= 0);
|
61
|
+
|
62
|
+
close_zero_linger(dealer);
|
63
|
+
close_zero_linger(router);
|
64
|
+
zmq_ctx_term(ctx);
|
65
|
+
}
|
@@ -46,7 +46,7 @@ void test_round_robin_out (void *ctx)
|
|
46
46
|
// We have to give the connects time to finish otherwise the requests
|
47
47
|
// will not properly round-robin. We could alternatively connect the
|
48
48
|
// REQ sockets to the REP sockets.
|
49
|
-
|
49
|
+
msleep (SETTLE_TIME);
|
50
50
|
|
51
51
|
// Send our peer-replies, and expect every REP it used once in order
|
52
52
|
for (size_t peer = 0; peer < services; peer++) {
|
@@ -89,15 +89,14 @@ test_stream_to_dealer (void)
|
|
89
89
|
assert (rc == sizeof (greeting));
|
90
90
|
|
91
91
|
// Now we expect the data from the DEALER socket
|
92
|
-
//
|
93
|
-
rc = zmq_msg_recv (&identity, stream, 0);
|
94
|
-
assert (rc > 0);
|
95
|
-
assert (zmq_msg_more (&identity));
|
96
|
-
|
97
|
-
// Second frame contains the rest of greeting along with
|
98
|
-
// the Ready command
|
92
|
+
// We want the rest of greeting along with the Ready command
|
99
93
|
int bytes_read = 0;
|
100
94
|
while (bytes_read < 97) {
|
95
|
+
// First frame is the identity of the connection (each time)
|
96
|
+
rc = zmq_msg_recv (&identity, stream, 0);
|
97
|
+
assert (rc > 0);
|
98
|
+
assert (zmq_msg_more (&identity));
|
99
|
+
// Second frame contains the next chunk of data
|
101
100
|
rc = zmq_recv (stream, buffer + bytes_read, 255 - bytes_read, 0);
|
102
101
|
assert (rc >= 0);
|
103
102
|
bytes_read += rc;
|
@@ -49,7 +49,7 @@ int main (void)
|
|
49
49
|
assert (rc == 0);
|
50
50
|
|
51
51
|
// Allow unbind to settle
|
52
|
-
|
52
|
+
msleep (SETTLE_TIME);
|
53
53
|
|
54
54
|
// Check that sending would block (there's no outbound connection)
|
55
55
|
rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT);
|
@@ -86,7 +86,7 @@ int main (void)
|
|
86
86
|
assert (rc == 0);
|
87
87
|
|
88
88
|
// Allow disconnect to settle
|
89
|
-
|
89
|
+
msleep (SETTLE_TIME);
|
90
90
|
|
91
91
|
// Check that sending would block (there's no inbound connections).
|
92
92
|
rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT);
|
@@ -22,7 +22,12 @@
|
|
22
22
|
|
23
23
|
#include "../include/zmq.h"
|
24
24
|
#include "../include/zmq_utils.h"
|
25
|
-
#include "platform.hpp"
|
25
|
+
#include "../src/platform.hpp"
|
26
|
+
|
27
|
+
// This defines the settle time used in tests; raise this if we
|
28
|
+
// get test failures on slower systems due to binds/connects not
|
29
|
+
// settled. Tested to work reliably at 1 msec on a fast PC.
|
30
|
+
#define SETTLE_TIME 10 // In msec
|
26
31
|
|
27
32
|
#undef NDEBUG
|
28
33
|
#include <time.h>
|
@@ -259,4 +264,16 @@ void setup_test_environment()
|
|
259
264
|
#endif
|
260
265
|
}
|
261
266
|
|
267
|
+
// Provide portable millisecond sleep
|
268
|
+
// http://www.cplusplus.com/forum/unices/60161/ http://en.cppreference.com/w/cpp/thread/sleep_for
|
269
|
+
void msleep (int milliseconds)
|
270
|
+
{
|
271
|
+
#ifdef ZMQ_HAVE_WINDOWS
|
272
|
+
Sleep (milliseconds);
|
273
|
+
#else
|
274
|
+
usleep (static_cast <useconds_t> (milliseconds) * 1000);
|
275
|
+
#endif
|
276
|
+
}
|
277
|
+
|
278
|
+
|
262
279
|
#endif
|
data/lib/zmq/socket.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class ZMQ::Socket::Stream
|
4
|
+
|
5
|
+
# == ZMQ::Socket::Stream
|
6
|
+
# A socket of type ZMQ::Socket::Stream is used to send and receive TCP data from a non-ØMQ peer,
|
7
|
+
# when using the tcp:// transport. A ZMQ::Socket::Stream socket can act as client and/or server,
|
8
|
+
# sending and/or receiving TCP data asynchronously.
|
9
|
+
#
|
10
|
+
# When receiving TCP data, a ZMQ::Socket::Stream socket shall prepend a message part containing
|
11
|
+
# the identity of the originating peer to the message before passing it to the application.
|
12
|
+
# Messages received are fair-queued from among all connected peers.
|
13
|
+
#
|
14
|
+
# When sending TCP data, a ZMQ::Socket::Stream socket shall remove the first part of the message
|
15
|
+
# and use it to determine the identity of the peer the message shall be routed to, and unroutable
|
16
|
+
# messages shall cause an EHOSTUNREACH or EAGAIN error.
|
17
|
+
#
|
18
|
+
# To open a connection to a server, use the zmq_connect call, and then fetch the socket identity
|
19
|
+
# using the ZMQ_IDENTITY zmq_getsockopt call.
|
20
|
+
#
|
21
|
+
# To close a specific client connection, as a server, send the identity frame followed by a zero-
|
22
|
+
# length message (see EXAMPLE section).
|
23
|
+
#
|
24
|
+
# The ZMQ_MSGMORE flag is ignored on data frames. You must send one identity frame followed by
|
25
|
+
# one data frame.
|
26
|
+
#
|
27
|
+
# Also, please note that omitting the ZMQ_MSGMORE flag will prevent sending further data (from
|
28
|
+
# any client) on the same socket.
|
29
|
+
#
|
30
|
+
# === Summary of ZMQ_STREAM characteristics
|
31
|
+
#
|
32
|
+
# [Compatible peer sockets] none.
|
33
|
+
# [Direction] Bidirectional
|
34
|
+
# [Send/receive pattern] Unrestricted
|
35
|
+
# [Outgoing routing strategy] See text
|
36
|
+
# [Incoming routing strategy] Fair-queued
|
37
|
+
# [ZMQ::Socket#hwm option action] EAGAIN
|
38
|
+
|
39
|
+
TYPE_STR = "STREAM"
|
40
|
+
|
41
|
+
def type
|
42
|
+
ZMQ::STREAM
|
43
|
+
end
|
44
|
+
end
|
data/lib/zmq/version.rb
CHANGED