rbczmq 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -231,16 +231,14 @@ Running tests
231
231
  * OS X leaks utility - http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/leaks.1.html
232
232
  * Handle GC issue with timers in loop callbacks
233
233
  * czmq send methods aren't non-blocking by default
234
- * Enforce socket timeouts
235
234
  * Revisit the ZMQ::Loop API
236
- * Push gem out to rubygems.org
237
235
  * RDOC fail on mixed C and Ruby source files that document that same constants
238
236
  * GC guards to prevent recycling objects being sent / received.
239
237
  * Sockets can bind && connect to multiple endpoints - account for that
240
238
  * Watch out for further cases where REQ / REP pairs could raise EFSM
241
239
  * Do not clobber local scope from macros (James's commit in master)
242
- * Support installation without vendor'ed libs as well
243
240
  * Incorporate examples into CI as well
241
+ * Zero-copy semantics for frames
244
242
 
245
243
  == Contact, feedback and bugs
246
244
 
Binary file
@@ -173,6 +173,50 @@ static VALUE rb_czmq_ctx_set_linger(VALUE obj, VALUE linger)
173
173
  return Qnil;
174
174
  }
175
175
 
176
+ /*
177
+ * call-seq:
178
+ * ctx.hwm => Fixnum
179
+ *
180
+ * Returns High Water Mark (HWM) option used for native thread creation (non-Ruby threads, ahead of time API addition)
181
+ *
182
+ * === Examples
183
+ * ctx = ZMQ::Context.new
184
+ * ctx.hwm => 1
185
+ *
186
+ */
187
+
188
+ static VALUE rb_czmq_ctx_hwm(VALUE obj)
189
+ {
190
+ errno = 0;
191
+ int wm;
192
+ ZmqGetContext(obj);
193
+ return INT2FIX(zctx_hwm(ctx->ctx));
194
+ }
195
+
196
+ /*
197
+ * call-seq:
198
+ * ctx.hwm = 100 => nil
199
+ *
200
+ * Sets the High Water Mark (HWM) option used for native thread creation (non-Ruby threads, ahead of time API addition)
201
+ *
202
+ * === Examples
203
+ * ctx = ZMQ::Context.new
204
+ * ctx.hwm = 100 => nil
205
+ *
206
+ */
207
+
208
+ static VALUE rb_czmq_ctx_set_hwm(VALUE obj, VALUE hwm)
209
+ {
210
+ errno = 0;
211
+ int wm;
212
+ ZmqGetContext(obj);
213
+ Check_Type(hwm, T_FIXNUM);
214
+ wm = FIX2INT(hwm);
215
+ if (wm < 0) rb_raise(rb_eZmqError, "negative HWM values is not supported.");
216
+ zctx_set_hwm(ctx->ctx, wm);
217
+ return Qnil;
218
+ }
219
+
176
220
  /*
177
221
  * :nodoc:
178
222
  * Creates a new socket while the GIL is released.
@@ -277,4 +321,6 @@ void _init_rb_czmq_context()
277
321
  rb_define_method(rb_cZmqContext, "iothreads=", rb_czmq_ctx_set_iothreads, 1);
278
322
  rb_define_method(rb_cZmqContext, "linger=", rb_czmq_ctx_set_linger, 1);
279
323
  rb_define_method(rb_cZmqContext, "socket", rb_czmq_ctx_socket, 1);
324
+ rb_define_method(rb_cZmqContext, "hwm", rb_czmq_ctx_hwm, 0);
325
+ rb_define_method(rb_cZmqContext, "hwm=", rb_czmq_ctx_set_hwm, 1);
280
326
  }
@@ -123,7 +123,7 @@ $INCFLAGS << " -I#{czmq_include_path}" if find_header("czmq.h", czmq_include_pat
123
123
  $LIBPATH << libs_path.to_s
124
124
 
125
125
  # Special case to prevent Rubinius compile from linking system libzmq if present
126
- if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
126
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/ && RUBY_PLATFORM =~ /linux/
127
127
  CONFIG['LDSHARED'] = "#{CONFIG['LDSHARED']} -Wl,-rpath=#{libs_path.to_s}"
128
128
  end
129
129
 
@@ -381,6 +381,7 @@ void _init_rb_czmq_frame()
381
381
 
382
382
  rb_define_const(rb_cZmqFrame, "MORE", INT2NUM(ZFRAME_MORE));
383
383
  rb_define_const(rb_cZmqFrame, "REUSE", INT2NUM(ZFRAME_REUSE));
384
+ rb_define_const(rb_cZmqFrame, "DONTWAIT", INT2NUM(ZFRAME_DONTWAIT));
384
385
 
385
386
  rb_define_singleton_method(rb_cZmqFrame, "new", rb_czmq_frame_s_new, -1);
386
387
  rb_define_method(rb_cZmqFrame, "destroy", rb_czmq_frame_destroy, 0);
@@ -1,10 +1,5 @@
1
1
  #include <rbczmq_ext.h>
2
2
 
3
- static VALUE intern_call;
4
- static VALUE intern_readable;
5
- static VALUE intern_writable;
6
- static VALUE intern_error;
7
-
8
3
  /*
9
4
  * :nodoc:
10
5
  * Wraps rb_funcall to support callbacks with or without callbacks.
@@ -393,11 +388,6 @@ static VALUE rb_czmq_loop_cancel_timer(VALUE obj, VALUE tm)
393
388
 
394
389
  void _init_rb_czmq_loop()
395
390
  {
396
- intern_call = rb_intern("call");
397
- intern_readable = rb_intern("on_readable");
398
- intern_writable = rb_intern("on_writable");
399
- intern_error = rb_intern("on_error");
400
-
401
391
  rb_cZmqLoop = rb_define_class_under(rb_mZmq, "Loop", rb_cObject);
402
392
 
403
393
  rb_define_alloc_func(rb_cZmqLoop, rb_czmq_loop_new);
@@ -207,6 +207,9 @@ VALUE rb_czmq_pollitem_handler(VALUE obj)
207
207
  VALUE rb_czmq_pollitem_handler_equals(VALUE obj, VALUE handler)
208
208
  {
209
209
  ZmqGetPollitem(obj);
210
+ ZmqAssertHandler(obj, pollitem, handler, intern_error);
211
+ ZmqAssertHandler(obj, pollitem, handler, intern_readable);
212
+ ZmqAssertHandler(obj, pollitem, handler, intern_writable);
210
213
  pollitem->handler = handler;
211
214
  return Qnil;
212
215
  }
@@ -16,6 +16,10 @@ typedef struct {
16
16
  Data_Get_Struct(obj, zmq_pollitem_wrapper, pollitem); \
17
17
  if (!pollitem) rb_raise(rb_eTypeError, "uninitialized ZMQ pollitem!");
18
18
 
19
+ #define ZmqAssertHandler(obj, pollitem, handler, callback) \
20
+ if (!rb_respond_to(handler, (callback))) \
21
+ rb_raise(rb_eZmqError, "Pollable entity %s's handler %s expected to implement an %s callback!", RSTRING_PTR(rb_obj_as_string(rb_czmq_pollitem_pollable((obj)))), rb_obj_classname(handler), rb_id2name((callback)));
22
+
19
23
  VALUE rb_czmq_pollitem_coerce(VALUE pollable);
20
24
  VALUE rb_czmq_pollitem_pollable(VALUE obj);
21
25
  VALUE rb_czmq_pollitem_events(VALUE obj);
@@ -24,6 +24,11 @@ VALUE rb_cZmqPollitem;
24
24
 
25
25
  st_table *frames_map = NULL;
26
26
 
27
+ VALUE intern_call;
28
+ VALUE intern_readable;
29
+ VALUE intern_writable;
30
+ VALUE intern_error;
31
+
27
32
  #ifdef HAVE_RUBY_ENCODING_H
28
33
  rb_encoding *binary_encoding;
29
34
  #endif
@@ -152,6 +157,11 @@ void Init_rbczmq_ext()
152
157
  {
153
158
  frames_map = st_init_numtable();
154
159
 
160
+ intern_call = rb_intern("call");
161
+ intern_readable = rb_intern("on_readable");
162
+ intern_writable = rb_intern("on_writable");
163
+ intern_error = rb_intern("on_error");
164
+
155
165
  #ifdef HAVE_RUBY_ENCODING_H
156
166
  binary_encoding = rb_enc_find("binary");
157
167
  #endif
@@ -61,6 +61,11 @@ extern VALUE rb_cZmqPollitem;
61
61
 
62
62
  extern st_table *frames_map;
63
63
 
64
+ extern VALUE intern_call;
65
+ extern VALUE intern_readable;
66
+ extern VALUE intern_writable;
67
+ extern VALUE intern_error;
68
+
64
69
  #include <context.h>
65
70
  #include <socket.h>
66
71
  #include <frame.h>
@@ -60,7 +60,7 @@ void rb_czmq_free_sock_gc(void *ptr)
60
60
  zclock_log ("I: %s socket %p, context %p: GC free", zsocket_type_str(sock->socket), sock, sock->ctx);
61
61
  /*
62
62
  XXX: cyclic dependency
63
- #4 0x0000000100712524 in zsockopt_set_linger (linger=1, socket=<value temporarily unavailable, due to optimizations>) at zsockopt.c:288
63
+ #4 0x0000000100712524 in zsocket_set_linger (linger=1, socket=<value temporarily unavailable, due to optimizations>) at zsocket.c:288
64
64
  if (sock->socket != NULL && !(sock->flags & ZMQ_SOCKET_DESTROYED)) rb_czmq_free_sock(sock);
65
65
  */
66
66
  #ifndef HAVE_RB_THREAD_BLOCKING_REGION
@@ -161,7 +161,7 @@ static VALUE rb_czmq_socket_fd(VALUE obj)
161
161
  zmq_sock_wrapper *sock = NULL;
162
162
  GetZmqSocket(obj);
163
163
  if (sock->state == ZMQ_SOCKET_PENDING) return INT2NUM(-1);
164
- return INT2NUM(zsockopt_fd(sock->socket));
164
+ return INT2NUM(zsocket_fd(sock->socket));
165
165
  }
166
166
 
167
167
  /*
@@ -307,10 +307,10 @@ static VALUE rb_czmq_nogvl_zstr_send(void *ptr)
307
307
  #else
308
308
  if (rb_thread_alone()) return (VALUE)zstr_send_nowait(socket->socket, args->msg);
309
309
  try_writable:
310
- if ((zsockopt_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
310
+ if ((zsocket_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
311
311
  return (VALUE)zstr_send_nowait(socket->socket, args->msg);
312
312
  } else {
313
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
313
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
314
314
  goto try_writable;
315
315
  }
316
316
  #endif
@@ -331,10 +331,10 @@ static VALUE rb_czmq_nogvl_zstr_sendm(void *ptr)
331
331
  #else
332
332
  if (rb_thread_alone()) return (VALUE)zstr_sendm(socket->socket, args->msg);
333
333
  try_writable:
334
- if ((zsockopt_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
334
+ if ((zsocket_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
335
335
  return (VALUE)zstr_sendm(socket->socket, args->msg);
336
336
  } else {
337
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
337
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
338
338
  goto try_writable;
339
339
  }
340
340
  #endif
@@ -421,13 +421,13 @@ static VALUE rb_czmq_nogvl_recv(void *ptr)
421
421
  if (zlist_size(socket->str_buffer) != 0)
422
422
  return (VALUE)zlist_pop(socket->str_buffer);
423
423
  try_readable:
424
- if ((zsockopt_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
424
+ if ((zsocket_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
425
425
  do {
426
426
  zlist_append(socket->str_buffer, zstr_recv_nowait(socket->socket));
427
427
  } while (zmq_errno() != EAGAIN && zmq_errno() != EINTR);
428
428
  return (VALUE)zlist_pop(socket->str_buffer);
429
429
  } else {
430
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
430
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
431
431
  goto try_readable;
432
432
  }
433
433
  #endif
@@ -515,10 +515,10 @@ static VALUE rb_czmq_nogvl_send_frame(void *ptr)
515
515
  #else
516
516
  if (rb_thread_alone()) return (VALUE)zframe_send(&(args->frame), socket->socket, args->flags);
517
517
  try_writable:
518
- if ((zsockopt_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
518
+ if ((zsocket_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
519
519
  return (VALUE)zframe_send(&(args->frame), socket->socket, args->flags);
520
520
  } else {
521
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
521
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
522
522
  goto try_writable;
523
523
  }
524
524
  #endif
@@ -596,10 +596,10 @@ static VALUE rb_czmq_nogvl_send_message(void *ptr)
596
596
  return Qnil;
597
597
  }
598
598
  try_writable:
599
- if ((zsockopt_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
599
+ if ((zsocket_events(socket->socket) & ZMQ_POLLOUT) == ZMQ_POLLOUT) {
600
600
  zmsg_send(&(args->message), socket->socket);
601
601
  } else {
602
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
602
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
603
603
  goto try_writable;
604
604
  }
605
605
  #endif
@@ -656,13 +656,13 @@ static VALUE rb_czmq_nogvl_recv_frame(void *ptr)
656
656
  if (zlist_size(socket->frame_buffer) != 0)
657
657
  return (VALUE)zlist_pop(socket->frame_buffer);
658
658
  try_readable:
659
- if ((zsockopt_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
659
+ if ((zsocket_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
660
660
  do {
661
661
  zlist_append(socket->frame_buffer, zframe_recv_nowait(socket->socket));
662
662
  } while (zmq_errno() != EAGAIN && zmq_errno() != EINTR);
663
663
  return (VALUE)zlist_pop(socket->frame_buffer);
664
664
  } else {
665
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
665
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
666
666
  goto try_readable;
667
667
  }
668
668
  #endif
@@ -751,13 +751,13 @@ static VALUE rb_czmq_nogvl_recv_message(void *ptr)
751
751
  if (zlist_size(socket->msg_buffer) != 0)
752
752
  return (VALUE)zlist_pop(socket->msg_buffer);
753
753
  try_readable:
754
- if ((zsockopt_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
754
+ if ((zsocket_events(socket->socket) & ZMQ_POLLIN) == ZMQ_POLLIN) {
755
755
  do {
756
756
  zlist_append(socket->msg_buffer, zmsg_recv(socket->socket));
757
757
  } while (zmq_errno() != EAGAIN && zmq_errno() != EINTR);
758
758
  return (VALUE)zlist_pop(socket->msg_buffer);
759
759
  } else {
760
- rb_thread_wait_fd(zsockopt_fd(socket->socket));
760
+ rb_thread_wait_fd(zsocket_fd(socket->socket));
761
761
  goto try_readable;
762
762
  }
763
763
  #endif
@@ -895,7 +895,7 @@ static VALUE rb_czmq_socket_opt_hwm(VALUE obj)
895
895
  {
896
896
  zmq_sock_wrapper *sock = NULL;
897
897
  GetZmqSocket(obj);
898
- return INT2NUM(zsockopt_hwm(sock->socket));
898
+ return INT2NUM(zsocket_hwm(sock->socket));
899
899
  }
900
900
 
901
901
  /*
@@ -915,7 +915,7 @@ static VALUE rb_czmq_socket_opt_hwm(VALUE obj)
915
915
  static VALUE rb_czmq_socket_set_opt_hwm(VALUE obj, VALUE value)
916
916
  {
917
917
  zmq_sock_wrapper *sock = NULL;
918
- ZmqSetSockOpt(obj, zsockopt_set_hwm, "HWM", value);
918
+ ZmqSetSockOpt(obj, zsocket_set_hwm, "HWM", value);
919
919
  }
920
920
 
921
921
  /*
@@ -935,7 +935,7 @@ static VALUE rb_czmq_socket_opt_swap(VALUE obj)
935
935
  {
936
936
  zmq_sock_wrapper *sock = NULL;
937
937
  GetZmqSocket(obj);
938
- return INT2NUM(zsockopt_swap(sock->socket));
938
+ return INT2NUM(zsocket_swap(sock->socket));
939
939
  }
940
940
 
941
941
  /*
@@ -954,7 +954,7 @@ static VALUE rb_czmq_socket_opt_swap(VALUE obj)
954
954
  static VALUE rb_czmq_socket_set_opt_swap(VALUE obj, VALUE value)
955
955
  {
956
956
  zmq_sock_wrapper *sock = NULL;
957
- ZmqSetSockOpt(obj, zsockopt_set_swap, "SWAP", value);
957
+ ZmqSetSockOpt(obj, zsocket_set_swap, "SWAP", value);
958
958
  }
959
959
 
960
960
  /*
@@ -974,7 +974,7 @@ static VALUE rb_czmq_socket_opt_affinity(VALUE obj)
974
974
  {
975
975
  zmq_sock_wrapper *sock = NULL;
976
976
  GetZmqSocket(obj);
977
- return INT2NUM(zsockopt_affinity(sock->socket));
977
+ return INT2NUM(zsocket_affinity(sock->socket));
978
978
  }
979
979
 
980
980
  /*
@@ -993,7 +993,7 @@ static VALUE rb_czmq_socket_opt_affinity(VALUE obj)
993
993
  static VALUE rb_czmq_socket_set_opt_affinity(VALUE obj, VALUE value)
994
994
  {
995
995
  zmq_sock_wrapper *sock = NULL;
996
- ZmqSetSockOpt(obj, zsockopt_set_affinity, "AFFINITY", value);
996
+ ZmqSetSockOpt(obj, zsocket_set_affinity, "AFFINITY", value);
997
997
  }
998
998
 
999
999
  /*
@@ -1013,7 +1013,7 @@ static VALUE rb_czmq_socket_opt_rate(VALUE obj)
1013
1013
  {
1014
1014
  zmq_sock_wrapper *sock = NULL;
1015
1015
  GetZmqSocket(obj);
1016
- return INT2NUM(zsockopt_rate(sock->socket));
1016
+ return INT2NUM(zsocket_rate(sock->socket));
1017
1017
  }
1018
1018
 
1019
1019
  /*
@@ -1032,7 +1032,7 @@ static VALUE rb_czmq_socket_opt_rate(VALUE obj)
1032
1032
  static VALUE rb_czmq_socket_set_opt_rate(VALUE obj, VALUE value)
1033
1033
  {
1034
1034
  zmq_sock_wrapper *sock = NULL;
1035
- ZmqSetSockOpt(obj, zsockopt_set_rate, "RATE", value);
1035
+ ZmqSetSockOpt(obj, zsocket_set_rate, "RATE", value);
1036
1036
  }
1037
1037
 
1038
1038
  /*
@@ -1052,7 +1052,7 @@ static VALUE rb_czmq_socket_opt_recovery_ivl(VALUE obj)
1052
1052
  {
1053
1053
  zmq_sock_wrapper *sock = NULL;
1054
1054
  GetZmqSocket(obj);
1055
- return INT2NUM(zsockopt_recovery_ivl(sock->socket));
1055
+ return INT2NUM(zsocket_recovery_ivl(sock->socket));
1056
1056
  }
1057
1057
 
1058
1058
  /*
@@ -1071,7 +1071,7 @@ static VALUE rb_czmq_socket_opt_recovery_ivl(VALUE obj)
1071
1071
  static VALUE rb_czmq_socket_set_opt_recovery_ivl(VALUE obj, VALUE value)
1072
1072
  {
1073
1073
  zmq_sock_wrapper *sock = NULL;
1074
- ZmqSetSockOpt(obj, zsockopt_set_recovery_ivl, "RECOVERY_IVL", value);
1074
+ ZmqSetSockOpt(obj, zsocket_set_recovery_ivl, "RECOVERY_IVL", value);
1075
1075
  }
1076
1076
 
1077
1077
  /*
@@ -1091,7 +1091,7 @@ static VALUE rb_czmq_socket_opt_recovery_ivl_msec(VALUE obj)
1091
1091
  {
1092
1092
  zmq_sock_wrapper *sock = NULL;
1093
1093
  GetZmqSocket(obj);
1094
- return INT2NUM(zsockopt_recovery_ivl_msec(sock->socket));
1094
+ return INT2NUM(zsocket_recovery_ivl_msec(sock->socket));
1095
1095
  }
1096
1096
 
1097
1097
  /*
@@ -1110,7 +1110,7 @@ static VALUE rb_czmq_socket_opt_recovery_ivl_msec(VALUE obj)
1110
1110
  static VALUE rb_czmq_socket_set_opt_recovery_ivl_msec(VALUE obj, VALUE value)
1111
1111
  {
1112
1112
  zmq_sock_wrapper *sock = NULL;
1113
- ZmqSetSockOpt(obj, zsockopt_set_recovery_ivl_msec, "RECOVERY_IVL_MSEC", value);
1113
+ ZmqSetSockOpt(obj, zsocket_set_recovery_ivl_msec, "RECOVERY_IVL_MSEC", value);
1114
1114
  }
1115
1115
 
1116
1116
  /*
@@ -1130,7 +1130,7 @@ static VALUE rb_czmq_socket_opt_mcast_loop(VALUE obj)
1130
1130
  {
1131
1131
  zmq_sock_wrapper *sock = NULL;
1132
1132
  GetZmqSocket(obj);
1133
- return (zsockopt_mcast_loop(sock->socket) == 1) ? Qtrue : Qfalse;
1133
+ return (zsocket_mcast_loop(sock->socket) == 1) ? Qtrue : Qfalse;
1134
1134
  }
1135
1135
 
1136
1136
  /*
@@ -1149,7 +1149,7 @@ static VALUE rb_czmq_socket_opt_mcast_loop(VALUE obj)
1149
1149
  static VALUE rb_czmq_socket_set_opt_mcast_loop(VALUE obj, VALUE value)
1150
1150
  {
1151
1151
  zmq_sock_wrapper *sock = NULL;
1152
- ZmqSetBooleanSockOpt(obj, zsockopt_set_mcast_loop, "MCAST_LOOP", value);
1152
+ ZmqSetBooleanSockOpt(obj, zsocket_set_mcast_loop, "MCAST_LOOP", value);
1153
1153
  }
1154
1154
 
1155
1155
  /*
@@ -1169,7 +1169,7 @@ static VALUE rb_czmq_socket_opt_sndbuf(VALUE obj)
1169
1169
  {
1170
1170
  zmq_sock_wrapper *sock = NULL;
1171
1171
  GetZmqSocket(obj);
1172
- return INT2NUM(zsockopt_sndbuf(sock->socket));
1172
+ return INT2NUM(zsocket_sndbuf(sock->socket));
1173
1173
  }
1174
1174
 
1175
1175
  /*
@@ -1188,7 +1188,7 @@ static VALUE rb_czmq_socket_opt_sndbuf(VALUE obj)
1188
1188
  static VALUE rb_czmq_socket_set_opt_sndbuf(VALUE obj, VALUE value)
1189
1189
  {
1190
1190
  zmq_sock_wrapper *sock = NULL;
1191
- ZmqSetSockOpt(obj, zsockopt_set_sndbuf, "SNDBUF", value);
1191
+ ZmqSetSockOpt(obj, zsocket_set_sndbuf, "SNDBUF", value);
1192
1192
  }
1193
1193
 
1194
1194
  /*
@@ -1208,7 +1208,7 @@ static VALUE rb_czmq_socket_opt_rcvbuf(VALUE obj)
1208
1208
  {
1209
1209
  zmq_sock_wrapper *sock = NULL;
1210
1210
  GetZmqSocket(obj);
1211
- return INT2NUM(zsockopt_rcvbuf(sock->socket));
1211
+ return INT2NUM(zsocket_rcvbuf(sock->socket));
1212
1212
  }
1213
1213
 
1214
1214
  /*
@@ -1227,7 +1227,7 @@ static VALUE rb_czmq_socket_opt_rcvbuf(VALUE obj)
1227
1227
  static VALUE rb_czmq_socket_set_opt_rcvbuf(VALUE obj, VALUE value)
1228
1228
  {
1229
1229
  zmq_sock_wrapper *sock = NULL;
1230
- ZmqSetSockOpt(obj, zsockopt_set_rcvbuf, "RCVBUF", value);
1230
+ ZmqSetSockOpt(obj, zsocket_set_rcvbuf, "RCVBUF", value);
1231
1231
  }
1232
1232
 
1233
1233
  /*
@@ -1247,7 +1247,7 @@ static VALUE rb_czmq_socket_opt_linger(VALUE obj)
1247
1247
  {
1248
1248
  zmq_sock_wrapper *sock = NULL;
1249
1249
  GetZmqSocket(obj);
1250
- return INT2NUM(zsockopt_linger(sock->socket));
1250
+ return INT2NUM(zsocket_linger(sock->socket));
1251
1251
  }
1252
1252
 
1253
1253
  /*
@@ -1266,7 +1266,7 @@ static VALUE rb_czmq_socket_opt_linger(VALUE obj)
1266
1266
  static VALUE rb_czmq_socket_set_opt_linger(VALUE obj, VALUE value)
1267
1267
  {
1268
1268
  zmq_sock_wrapper *sock = NULL;
1269
- ZmqSetSockOpt(obj, zsockopt_set_linger, "LINGER", value);
1269
+ ZmqSetSockOpt(obj, zsocket_set_linger, "LINGER", value);
1270
1270
  }
1271
1271
 
1272
1272
  /*
@@ -1286,7 +1286,7 @@ static VALUE rb_czmq_socket_opt_backlog(VALUE obj)
1286
1286
  {
1287
1287
  zmq_sock_wrapper *sock = NULL;
1288
1288
  GetZmqSocket(obj);
1289
- return INT2NUM(zsockopt_backlog(sock->socket));
1289
+ return INT2NUM(zsocket_backlog(sock->socket));
1290
1290
  }
1291
1291
 
1292
1292
  /*
@@ -1305,7 +1305,7 @@ static VALUE rb_czmq_socket_opt_backlog(VALUE obj)
1305
1305
  static VALUE rb_czmq_socket_set_opt_backlog(VALUE obj, VALUE value)
1306
1306
  {
1307
1307
  zmq_sock_wrapper *sock = NULL;
1308
- ZmqSetSockOpt(obj, zsockopt_set_backlog, "BACKLOG", value);
1308
+ ZmqSetSockOpt(obj, zsocket_set_backlog, "BACKLOG", value);
1309
1309
  }
1310
1310
 
1311
1311
  /*
@@ -1325,7 +1325,7 @@ static VALUE rb_czmq_socket_opt_reconnect_ivl(VALUE obj)
1325
1325
  {
1326
1326
  zmq_sock_wrapper *sock = NULL;
1327
1327
  GetZmqSocket(obj);
1328
- return INT2NUM(zsockopt_reconnect_ivl(sock->socket));
1328
+ return INT2NUM(zsocket_reconnect_ivl(sock->socket));
1329
1329
  }
1330
1330
 
1331
1331
  /*
@@ -1344,7 +1344,7 @@ static VALUE rb_czmq_socket_opt_reconnect_ivl(VALUE obj)
1344
1344
  static VALUE rb_czmq_socket_set_opt_reconnect_ivl(VALUE obj, VALUE value)
1345
1345
  {
1346
1346
  zmq_sock_wrapper *sock = NULL;
1347
- ZmqSetSockOpt(obj, zsockopt_set_reconnect_ivl, "RECONNECT_IVL", value);
1347
+ ZmqSetSockOpt(obj, zsocket_set_reconnect_ivl, "RECONNECT_IVL", value);
1348
1348
  }
1349
1349
 
1350
1350
  /*
@@ -1364,7 +1364,7 @@ static VALUE rb_czmq_socket_opt_reconnect_ivl_max(VALUE obj)
1364
1364
  {
1365
1365
  zmq_sock_wrapper *sock = NULL;
1366
1366
  GetZmqSocket(obj);
1367
- return INT2NUM(zsockopt_reconnect_ivl_max(sock->socket));
1367
+ return INT2NUM(zsocket_reconnect_ivl_max(sock->socket));
1368
1368
  }
1369
1369
 
1370
1370
  /*
@@ -1383,7 +1383,7 @@ static VALUE rb_czmq_socket_opt_reconnect_ivl_max(VALUE obj)
1383
1383
  static VALUE rb_czmq_socket_set_opt_reconnect_ivl_max(VALUE obj, VALUE value)
1384
1384
  {
1385
1385
  zmq_sock_wrapper *sock = NULL;
1386
- ZmqSetSockOpt(obj, zsockopt_set_reconnect_ivl_max, "RECONNECT_IVL_MAX", value);
1386
+ ZmqSetSockOpt(obj, zsocket_set_reconnect_ivl_max, "RECONNECT_IVL_MAX", value);
1387
1387
  }
1388
1388
 
1389
1389
  /*
@@ -1409,7 +1409,7 @@ static VALUE rb_czmq_socket_set_opt_identity(VALUE obj, VALUE value)
1409
1409
  if (RSTRING_LEN(value) == 0) rb_raise(rb_eZmqError, "socket identity cannot be empty.");
1410
1410
  if (RSTRING_LEN(value) > 255) rb_raise(rb_eZmqError, "maximum socket identity is 255 chars.");
1411
1411
  val = StringValueCStr(value);
1412
- zsockopt_set_identity(sock->socket, val);
1412
+ zsocket_set_identity(sock->socket, val);
1413
1413
  if (sock->verbose)
1414
1414
  zclock_log ("I: %s socket %p: set option \"IDENTITY\" \"%s\"", zsocket_type_str(sock->socket), obj, val);
1415
1415
  return Qnil;
@@ -1431,7 +1431,7 @@ static VALUE rb_czmq_socket_set_opt_identity(VALUE obj, VALUE value)
1431
1431
  static VALUE rb_czmq_socket_set_opt_subscribe(VALUE obj, VALUE value)
1432
1432
  {
1433
1433
  zmq_sock_wrapper *sock = NULL;
1434
- ZmqSetStringSockOpt(obj, zsockopt_set_subscribe, "SUBSCRIBE", value, {
1434
+ ZmqSetStringSockOpt(obj, zsocket_set_subscribe, "SUBSCRIBE", value, {
1435
1435
  ZmqAssertSockOptFor(ZMQ_SUB)
1436
1436
  });
1437
1437
  }
@@ -1452,7 +1452,7 @@ static VALUE rb_czmq_socket_set_opt_subscribe(VALUE obj, VALUE value)
1452
1452
  static VALUE rb_czmq_socket_set_opt_unsubscribe(VALUE obj, VALUE value)
1453
1453
  {
1454
1454
  zmq_sock_wrapper *sock = NULL;
1455
- ZmqSetStringSockOpt(obj, zsockopt_set_unsubscribe, "UNSUBSCRIBE", value, {
1455
+ ZmqSetStringSockOpt(obj, zsocket_set_unsubscribe, "UNSUBSCRIBE", value, {
1456
1456
  ZmqAssertSockOptFor(ZMQ_SUB)
1457
1457
  });
1458
1458
  }
@@ -1474,7 +1474,7 @@ static VALUE rb_czmq_socket_opt_rcvmore(VALUE obj)
1474
1474
  {
1475
1475
  zmq_sock_wrapper *sock = NULL;
1476
1476
  GetZmqSocket(obj);
1477
- return (zsockopt_rcvmore(sock->socket) == 1) ? Qtrue : Qfalse;
1477
+ return (zsocket_rcvmore(sock->socket) == 1) ? Qtrue : Qfalse;
1478
1478
  }
1479
1479
 
1480
1480
  /*
@@ -1494,7 +1494,85 @@ static VALUE rb_czmq_socket_opt_events(VALUE obj)
1494
1494
  {
1495
1495
  zmq_sock_wrapper *sock = NULL;
1496
1496
  GetZmqSocket(obj);
1497
- return INT2NUM(zsockopt_events(sock->socket));
1497
+ return INT2NUM(zsocket_events(sock->socket));
1498
+ }
1499
+
1500
+ /*
1501
+ * call-seq:
1502
+ * sock.rcvtimeo => Fixnum
1503
+ *
1504
+ * Returns the socket RCVTIMEO value.
1505
+ *
1506
+ * === Examples
1507
+ * ctx = ZMQ::Context.new
1508
+ * sock = ctx.socket(:REP)
1509
+ * sock.rcvtimeo => -1
1510
+ *
1511
+ */
1512
+
1513
+ static VALUE rb_czmq_socket_opt_rcvtimeo(VALUE obj)
1514
+ {
1515
+ zmq_sock_wrapper *sock = NULL;
1516
+ GetZmqSocket(obj);
1517
+ return INT2NUM(zsocket_rcvtimeo(sock->socket));
1518
+ }
1519
+
1520
+ /*
1521
+ * call-seq:
1522
+ * sock.rcvtimeout = 200 => nil
1523
+ *
1524
+ * Sets the socket RCVTIMEO value.
1525
+ *
1526
+ * === Examples
1527
+ * ctx = ZMQ::Context.new
1528
+ * sock = ctx.socket(:REP)
1529
+ * sock.rcvtimeo = 200 => nil
1530
+ *
1531
+ */
1532
+
1533
+ static VALUE rb_czmq_socket_set_opt_rcvtimeo(VALUE obj, VALUE value)
1534
+ {
1535
+ zmq_sock_wrapper *sock = NULL;
1536
+ ZmqSetSockOpt(obj, zsocket_set_rcvtimeo, "RCVTIMEO", value);
1537
+ }
1538
+
1539
+ /*
1540
+ * call-seq:
1541
+ * sock.sndtimeo => Fixnum
1542
+ *
1543
+ * Returns the socket SNDTIMEO value.
1544
+ *
1545
+ * === Examples
1546
+ * ctx = ZMQ::Context.new
1547
+ * sock = ctx.socket(:REP)
1548
+ * sock.sndtimeo => -1
1549
+ *
1550
+ */
1551
+
1552
+ static VALUE rb_czmq_socket_opt_sndtimeo(VALUE obj)
1553
+ {
1554
+ zmq_sock_wrapper *sock = NULL;
1555
+ GetZmqSocket(obj);
1556
+ return INT2NUM(zsocket_sndtimeo(sock->socket));
1557
+ }
1558
+
1559
+ /*
1560
+ * call-seq:
1561
+ * sock.sndtimeout = 200 => nil
1562
+ *
1563
+ * Sets the socket SNDTIMEO value.
1564
+ *
1565
+ * === Examples
1566
+ * ctx = ZMQ::Context.new
1567
+ * sock = ctx.socket(:REP)
1568
+ * sock.sndtimeo = 200 => nil
1569
+ *
1570
+ */
1571
+
1572
+ static VALUE rb_czmq_socket_set_opt_sndtimeo(VALUE obj, VALUE value)
1573
+ {
1574
+ zmq_sock_wrapper *sock = NULL;
1575
+ ZmqSetSockOpt(obj, zsocket_set_sndtimeo, "SNDTIMEO", value);
1498
1576
  }
1499
1577
 
1500
1578
  void _init_rb_czmq_socket()
@@ -1567,4 +1645,8 @@ void _init_rb_czmq_socket()
1567
1645
  rb_define_method(rb_cZmqSocket, "unsubscribe", rb_czmq_socket_set_opt_unsubscribe, 1);
1568
1646
  rb_define_method(rb_cZmqSocket, "rcvmore?", rb_czmq_socket_opt_rcvmore, 0);
1569
1647
  rb_define_method(rb_cZmqSocket, "events", rb_czmq_socket_opt_events, 0);
1648
+ rb_define_method(rb_cZmqSocket, "rcvtimeo", rb_czmq_socket_opt_rcvtimeo, 0);
1649
+ rb_define_method(rb_cZmqSocket, "rcvtimeo=", rb_czmq_socket_set_opt_rcvtimeo, 1);
1650
+ rb_define_method(rb_cZmqSocket, "sndtimeo", rb_czmq_socket_opt_sndtimeo, 0);
1651
+ rb_define_method(rb_cZmqSocket, "sndtimeo=", rb_czmq_socket_set_opt_sndtimeo, 1);
1570
1652
  }
@@ -53,7 +53,7 @@ typedef struct {
53
53
  rb_raise(rb_eZmqError, "Cross thread violation for %s socket %p: created in thread %p, invoked on thread %p", zsocket_type_str((sock)->socket), (void *)(sock), (void *)(sock)->thread, (void *)rb_thread_current());
54
54
 
55
55
  #define ZmqAssertSockOptFor(sock_type) \
56
- if (zsockopt_type(sock->socket) != sock_type) \
56
+ if (zsocket_type(sock->socket) != sock_type) \
57
57
  rb_raise(rb_eZmqError, "Socket option not supported on a %s socket!", zsocket_type_str(sock->socket));
58
58
 
59
59
  #define CheckBoolean(arg) \
@@ -1,7 +1,5 @@
1
1
  #include <rbczmq_ext.h>
2
2
 
3
- static VALUE intern_call;
4
-
5
3
  /*
6
4
  * :nodoc:
7
5
  * GC mark callback
@@ -99,8 +97,6 @@ static VALUE rb_czmq_timer_cancel(VALUE obj)
99
97
 
100
98
  void _init_rb_czmq_timer()
101
99
  {
102
- intern_call = rb_intern("call");
103
-
104
100
  rb_cZmqTimer = rb_define_class_under(rb_mZmq, "Timer", rb_cObject);
105
101
 
106
102
  rb_define_singleton_method(rb_cZmqTimer, "new", rb_czmq_timer_s_new, -1);
Binary file
@@ -63,7 +63,6 @@ class ZMQ::Loop
63
63
  def self.register_readable(pollable, handler = ZMQ::DefaultHandler, *args)
64
64
  pollitem = ZMQ::Pollitem.new(pollable, ZMQ::POLLIN)
65
65
  pollitem.handler = handler.new(pollitem, *args) if handler
66
- assert_handler_for_event(pollitem, :on_readable)
67
66
  instance.register(pollitem)
68
67
  end
69
68
 
@@ -76,7 +75,6 @@ class ZMQ::Loop
76
75
  def self.register_writable(pollable, handler = ZMQ::DefaultHandler, *args)
77
76
  pollitem = ZMQ::Pollitem.new(pollable, ZMQ::POLLOUT)
78
77
  pollitem.handler = handler.new(pollitem, *args) if handler
79
- assert_handler_for_event(pollitem, :on_writable)
80
78
  instance.register(pollitem)
81
79
  end
82
80
 
@@ -119,13 +117,6 @@ class ZMQ::Loop
119
117
  register_writable(socket, handler, args) if socket.poll_writable?
120
118
  ret
121
119
  end
122
-
123
- def self.assert_handler_for_event(pollitem, cb)
124
- unless pollitem.handler.respond_to?(cb)
125
- pollitem.handler = nil
126
- raise ZMQ::Error, "Pollable entity #{pollitem.pollable}'s handler #{pollitem.handler.class} expected to implement an #{cb} callback!"
127
- end
128
- end
129
120
  end
130
121
 
131
122
  ZL = ZMQ::Loop
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module ZMQ
4
- VERSION = "0.1"
4
+ VERSION = "0.2"
5
5
  end
@@ -49,7 +49,7 @@ class TestZmqContext < ZmqTestCase
49
49
  def test_linger
50
50
  ctx = ZMQ::Context.new
51
51
  assert_raises TypeError do
52
- ctx.linger = :invalid
52
+ ctx.linger = :invalid
53
53
  end
54
54
  ctx.linger = 10
55
55
  assert_raises ZMQ::Error do
@@ -59,6 +59,20 @@ class TestZmqContext < ZmqTestCase
59
59
  ctx.destroy
60
60
  end
61
61
 
62
+ def test_hwm
63
+ ctx = ZMQ::Context.new
64
+ assert_raises TypeError do
65
+ ctx.hwm = :invalid
66
+ end
67
+ ctx.hwm = 10
68
+ assert_raises ZMQ::Error do
69
+ ctx.hwm = -2
70
+ end
71
+ assert_equal 10, ctx.hwm
72
+ ensure
73
+ ctx.destroy
74
+ end
75
+
62
76
  def test_bind_connect
63
77
  ctx = ZMQ::Context.new
64
78
  rep = ctx.bind(:REP, "inproc://test.bind_connect")
@@ -43,10 +43,20 @@ class TestZmqPollitem < ZmqTestCase
43
43
  ctx.destroy
44
44
  end
45
45
 
46
+ class TestHandler
47
+ def initialize(*args); end
48
+ def on_error(*args); end
49
+ def on_readable(*args); end
50
+ def on_writable(*args); end
51
+ end
52
+
46
53
  def test_handler
47
54
  pollitem = ZMQ::Pollitem.new(STDIN, ZMQ::POLLIN)
48
55
  assert_nil pollitem.handler
49
- handler = Module.new
56
+ assert_raises ZMQ::Error do
57
+ pollitem.handler = Module.new
58
+ end
59
+ handler = TestHandler.new
50
60
  pollitem.handler = handler
51
61
  assert_equal handler, pollitem.handler
52
62
  end
@@ -296,6 +296,25 @@ class TestZmqSocket < ZmqTestCase
296
296
  ctx.destroy
297
297
  end
298
298
 
299
+ def test_send_frame_dontwait
300
+ ctx = ZMQ::Context.new
301
+ rep = ctx.socket(:PAIR)
302
+ rep.bind("inproc://test.socket-send_frame_dontwait")
303
+ req = ctx.socket(:PAIR)
304
+ req.connect("inproc://test.socket-send_frame_dontwait")
305
+ 5.times do |i|
306
+ frame = ZMQ::Frame("m#{i}")
307
+ req.send_frame(frame, ZMQ::Frame::DONTWAIT)
308
+ end
309
+ expected, frames = %w(m0 m1 m2 m3 m4), []
310
+ 5.times do
311
+ frames << rep.recv_frame.data
312
+ end
313
+ assert_equal expected, frames
314
+ ensure
315
+ ctx.destroy
316
+ end
317
+
299
318
  def test_send_receive_message
300
319
  ctx = ZMQ::Context.new
301
320
  rep = ctx.socket(:PAIR)
@@ -381,6 +400,14 @@ class TestZmqSocket < ZmqTestCase
381
400
  sock.reconnect_ivl_max = 5
382
401
  assert_equal 5, sock.reconnect_ivl_max
383
402
 
403
+ assert_equal -1, sock.rcvtimeo
404
+ sock.rcvtimeo = 200
405
+ assert_equal 200, sock.rcvtimeo
406
+
407
+ assert_equal -1, sock.sndtimeo
408
+ sock.sndtimeo = 200
409
+ assert_equal 200, sock.sndtimeo
410
+
384
411
  sock.identity = "anonymous"
385
412
  assert_raises ZMQ::Error do
386
413
  sock.identity = ""
@@ -8,7 +8,7 @@ class TestZmq < ZmqTestCase
8
8
  end
9
9
 
10
10
  def test_version
11
- assert_equal [2,1,11], ZMQ.version
11
+ assert_equal [2,2,1], ZMQ.version
12
12
  end
13
13
 
14
14
  def test_now
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbczmq
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 4423076201732757652
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- version: "0.1"
8
+ - 2
9
+ version: "0.2"
10
10
  platform: ruby
11
11
  authors:
12
12
  - "Lourens Naud\xC3\xA9"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-02-21 00:00:00 +00:00
18
+ date: 2012-04-09 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 63
29
+ hash: 289844351982071926
30
30
  segments:
31
31
  - 0
32
32
  - 8
@@ -159,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
159
  requirements:
160
160
  - - ">="
161
161
  - !ruby/object:Gem::Version
162
- hash: 3
162
+ hash: 2002549777813010636
163
163
  segments:
164
164
  - 0
165
165
  version: "0"
@@ -168,14 +168,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
168
  requirements:
169
169
  - - ">="
170
170
  - !ruby/object:Gem::Version
171
- hash: 3
171
+ hash: 2002549777813010636
172
172
  segments:
173
173
  - 0
174
174
  version: "0"
175
175
  requirements: []
176
176
 
177
177
  rubyforge_project:
178
- rubygems_version: 1.6.2
178
+ rubygems_version: 1.5.2
179
179
  signing_key:
180
180
  specification_version: 3
181
181
  summary: "Ruby extension for CZMQ - High-level C Binding for \xC3\x98MQ (http://czmq.zeromq.org)"