rbczmq 1.7.3 → 1.7.4

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