rbczmq 1.7.3 → 1.7.4

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTFiODAyNWE1MjM4MGVlODE0YmIxMGQyYTIyOWM3ZDlkNTc0ZWVhMw==
4
+ OWI3ZDU3NzMwMTQ5NzEwYTY1MzkwYzA3NmQzYmY2YjE5YzI0NmM5MQ==
5
5
  data.tar.gz: !binary |-
6
- MjIzNzk5NzE5YWNhMmY3M2U2ODRmNmFmNzYxZmM2YzM4ZDJiMzJlOQ==
6
+ ZTlhN2Q2NzM1NzYxZjNlMjEzOWM3ZTVkNmYyM2FiMmQzYzE2NzIyYQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NzNhNjFiZjRmNjllZjQyNmVjZjYzNGFmNTE2OGIxOThhNzUyY2NjMzA2NmE3
10
- OGM1YzY4OTRkYzZhNDZmNjE3MzBmMTM0OTk5NzI5NzdkOTczOWQ5NWI0NjU0
11
- Y2Q1ZDFmNGNjZDViYTIwZmY0YThlYjEyMTQ5ZjBmMGFiMWQ5OGU=
9
+ MzEzNjBiMTI2YmI3MGZkYjcyNjkzY2I1ODA2YWRhYzRjZGQ2ZTUzMzNkNzk4
10
+ MmQzNWIxMTExOTkwNWU4NzI3ZjZkNmVlOTVjY2U0MDE4MWQzMTYxNDhjMmU4
11
+ NjIyODg0ZGMxMjdjZWRmZjExOWMyZTA2OTAyNDY5ZTcyMmJkMDk=
12
12
  data.tar.gz: !binary |-
13
- ZDYxNTQ4MzgxNjhkY2I1OTg3ZTU2MTVkOTliZWQ1Yzg2YTZkNmIwMzU1NTlk
14
- MmRkNGUyZGRiY2U4Zjk5NTRhZmU1N2U5ZWM3YTIyMzY5ODJmODUyY2FhMWU2
15
- NTYwZWVlM2E2OTA3NzQ3MjU0YWZiNzMxYjI0ZThlMDY2ZTk5NDQ=
13
+ Mzg3MDk5M2E1MjIwOGU3Yjg2NjlkMWZlMGNmYjM2NDE2NWQ5MTM2N2RhM2Y1
14
+ NTJiMDNiMTUyNTk0ZGM2ODRmYjc0YTE0NTA1MmRhZGU2NDM3NzY2OTA0NDEx
15
+ MGYxNTk1OGE1N2VmYzJhODdjNGE4MTFjMzRhMjBlZmNhMWJlYjg=
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,9 @@
1
1
  = Changelog
2
2
 
3
+ == 1.7.4 (November 25, 2013)
4
+
5
+ * Update ZMQ::Socket to support strings with null bytes in them (Matt Connolly)
6
+
3
7
  == 1.7.3 (November 11, 2013)
4
8
 
5
9
  * Add an array of poll items to ZMQ::Loop so that they are not garbage collected. #25
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbczmq (1.7.3)
4
+ rbczmq (1.7.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- json (1.8.0)
9
+ json (1.8.1)
10
10
  rake (10.1.0)
11
11
  rake-compiler (0.8.3)
12
12
  rake
data/ext/rbczmq/socket.c CHANGED
@@ -346,6 +346,25 @@ static VALUE rb_czmq_socket_set_verbose(VALUE obj, VALUE level)
346
346
  return Qnil;
347
347
  }
348
348
 
349
+ /*
350
+ * :nodoc:
351
+ *
352
+ * Based on czmq `s_send_string` to send a C string. We need to be able to support
353
+ * strings that contain null bytes, so we cannot use zstr_send as it is intended for
354
+ * null terminated C strings.
355
+ */
356
+ static int rb_czmq_nogvl_zstr_send_internal(struct nogvl_send_args *args, int flags)
357
+ {
358
+ errno = 0;
359
+ zmq_sock_wrapper *socket = args->socket;
360
+
361
+ zmq_msg_t message;
362
+ zmq_msg_init_size(&message, args->length);
363
+ memcpy(zmq_msg_data(&message), args->msg, args->length);
364
+ int rc = zmq_sendmsg(socket->socket, &message, flags);
365
+ return (rc == -1? -1: 0);
366
+ }
367
+
349
368
  /*
350
369
  * :nodoc:
351
370
  * Sends a raw string while the GIL is released.
@@ -355,8 +374,8 @@ static VALUE rb_czmq_nogvl_zstr_send(void *ptr)
355
374
  {
356
375
  struct nogvl_send_args *args = ptr;
357
376
  errno = 0;
358
- zmq_sock_wrapper *socket = args->socket;
359
- return (VALUE)zstr_send(socket->socket, "%s", args->msg);
377
+ int rc = rb_czmq_nogvl_zstr_send_internal(args, 0);
378
+ return (VALUE)rc;
360
379
  }
361
380
 
362
381
  /*
@@ -368,8 +387,8 @@ static VALUE rb_czmq_nogvl_zstr_sendm(void *ptr)
368
387
  {
369
388
  struct nogvl_send_args *args = ptr;
370
389
  errno = 0;
371
- zmq_sock_wrapper *socket = args->socket;
372
- return (VALUE)zstr_sendm(socket->socket, "%s", args->msg);
390
+ int rc = rb_czmq_nogvl_zstr_send_internal(args, ZMQ_SNDMORE);
391
+ return (VALUE)rc;
373
392
  }
374
393
 
375
394
  /*
@@ -394,9 +413,11 @@ static VALUE rb_czmq_socket_send(VALUE obj, VALUE msg)
394
413
  GetZmqSocket(obj);
395
414
  ZmqAssertSocketNotPending(sock, "can only send on a bound or connected socket!");
396
415
  ZmqSockGuardCrossThread(sock);
397
- Check_Type(msg, T_STRING);
398
416
  args.socket = sock;
399
- args.msg = StringValueCStr(msg);
417
+ StringValue(msg);
418
+ Check_Type(msg, T_STRING);
419
+ args.msg = RSTRING_PTR(msg);
420
+ args.length = RSTRING_LEN(msg);
400
421
  rc = (int)rb_thread_blocking_region(rb_czmq_nogvl_zstr_send, (void *)&args, RUBY_UBF_IO, 0);
401
422
  ZmqAssert(rc);
402
423
  if (sock->verbose)
@@ -427,9 +448,11 @@ static VALUE rb_czmq_socket_sendm(VALUE obj, VALUE msg)
427
448
  GetZmqSocket(obj);
428
449
  ZmqAssertSocketNotPending(sock, "can only send on a bound or connected socket!");
429
450
  ZmqSockGuardCrossThread(sock);
430
- Check_Type(msg, T_STRING);
431
451
  args.socket = sock;
432
- args.msg = StringValueCStr(msg);
452
+ StringValue(msg);
453
+ Check_Type(msg, T_STRING);
454
+ args.msg = RSTRING_PTR(msg);
455
+ args.length = RSTRING_LEN(msg);
433
456
  rc = (int)rb_thread_blocking_region(rb_czmq_nogvl_zstr_sendm, (void *)&args, RUBY_UBF_IO, 0);
434
457
  ZmqAssert(rc);
435
458
  if (sock->verbose)
@@ -447,7 +470,13 @@ static VALUE rb_czmq_nogvl_recv(void *ptr)
447
470
  struct nogvl_recv_args *args = ptr;
448
471
  errno = 0;
449
472
  zmq_sock_wrapper *socket = args->socket;
450
- return (VALUE)zstr_recv(socket->socket);
473
+
474
+ // implement similar to zstr_recv, except that the copy to the string is done
475
+ // after we return with the GIL so that the ruby string object can be created
476
+ // from the zmq message buffer in a single copy.
477
+ assert (socket->socket);
478
+ int rc = zmq_recvmsg(socket->socket, &args->message, 0);
479
+ return (VALUE)rc;
451
480
  }
452
481
 
453
482
  /*
@@ -474,13 +503,21 @@ static VALUE rb_czmq_socket_recv(VALUE obj)
474
503
  ZmqAssertSocketNotPending(sock, "can only receive on a bound or connected socket!");
475
504
  ZmqSockGuardCrossThread(sock);
476
505
  args.socket = sock;
477
- str = (char *)rb_thread_blocking_region(rb_czmq_nogvl_recv, (void *)&args, RUBY_UBF_IO, 0);
478
- if (str == NULL) return result;
506
+ zmq_msg_init(&args.message);
507
+
508
+ int rc = (int)rb_thread_blocking_region(rb_czmq_nogvl_recv, (void *)&args, RUBY_UBF_IO, 0);
509
+ if (rc < 0) {
510
+ zmq_msg_close(&args.message);
511
+ return Qnil;
512
+ }
479
513
  ZmqAssertSysError();
480
514
  if (sock->verbose)
481
515
  zclock_log ("I: %s socket %p: recv \"%s\"", zsocket_type_str(sock->socket), sock->socket, str);
482
- result = ZmqEncode(rb_str_new2(str));
483
- free(str);
516
+
517
+ result = rb_str_new(zmq_msg_data(&args.message), zmq_msg_size(&args.message));
518
+ zmq_msg_close(&args.message);
519
+
520
+ result = ZmqEncode(result);
484
521
  return result;
485
522
  }
486
523
 
@@ -501,19 +538,29 @@ static VALUE rb_czmq_socket_recv(VALUE obj)
501
538
  static VALUE rb_czmq_socket_recv_nonblock(VALUE obj)
502
539
  {
503
540
  char *str = NULL;
541
+ struct nogvl_recv_args args;
504
542
  errno = 0;
505
543
  VALUE result = Qnil;
506
544
  zmq_sock_wrapper *sock = NULL;
507
545
  GetZmqSocket(obj);
508
546
  ZmqAssertSocketNotPending(sock, "can only receive on a bound or connected socket!");
509
547
  ZmqSockGuardCrossThread(sock);
510
- str = zstr_recv_nowait(sock->socket);
511
- if (str == NULL) return result;
548
+
549
+ zmq_msg_init(&args.message);
550
+
551
+ int rc = zmq_recvmsg(sock->socket, &args.message, ZMQ_DONTWAIT);
552
+ if (rc < 0) {
553
+ zmq_msg_close(&args.message);
554
+ return Qnil;
555
+ }
512
556
  ZmqAssertSysError();
513
557
  if (sock->verbose)
514
- zclock_log ("I: %s socket %p: recv_nonblock \"%s\"", zsocket_type_str(sock->socket), sock->socket, str);
515
- result = ZmqEncode(rb_str_new2(str));
516
- free(str);
558
+ zclock_log ("I: %s socket %p: recv \"%s\"", zsocket_type_str(sock->socket), sock->socket, str);
559
+
560
+ result = rb_str_new(zmq_msg_data(&args.message), zmq_msg_size(&args.message));
561
+ zmq_msg_close(&args.message);
562
+
563
+ result = ZmqEncode(result);
517
564
  return result;
518
565
  }
519
566
 
data/ext/rbczmq/socket.h CHANGED
@@ -102,6 +102,7 @@ void rb_czmq_free_sock_gc(void *ptr);
102
102
  struct nogvl_send_args {
103
103
  zmq_sock_wrapper *socket;
104
104
  const char *msg;
105
+ long length;
105
106
  bool read;
106
107
  };
107
108
 
@@ -120,6 +121,7 @@ struct nogvl_send_message_args {
120
121
 
121
122
  struct nogvl_recv_args {
122
123
  zmq_sock_wrapper *socket;
124
+ zmq_msg_t message;
123
125
  };
124
126
 
125
127
  struct nogvl_socket_poll_args {
data/lib/zmq/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module ZMQ
4
- VERSION = "1.7.3"
4
+ VERSION = "1.7.4"
5
5
  end
data/test/test_socket.rb CHANGED
@@ -275,6 +275,19 @@ class TestZmqSocket < ZmqTestCase
275
275
  ensure
276
276
  ctx.destroy
277
277
  end
278
+
279
+ def test_send_receive_with_null_in_string
280
+ string = [1,0,1,2,3,4,5].pack('c*')
281
+ ctx = ZMQ::Context.new
282
+ rep = ctx.socket(:PAIR)
283
+ rep.bind("inproc://test.socket-send_receive")
284
+ req = ctx.socket(:PAIR)
285
+ req.connect("inproc://test.socket-send_receive")
286
+ assert req.send(string)
287
+ assert_equal string, rep.recv
288
+ ensure
289
+ ctx.destroy
290
+ end
278
291
 
279
292
  def test_verbose
280
293
  ctx = ZMQ::Context.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbczmq
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 1.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lourens Naudé
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-11-11 00:00:00.000000000 Z
13
+ date: 2013-11-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake-compiler