rbczmq 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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)"