rbczmq 1.7.0 → 1.7.1
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 +8 -8
- data/CHANGELOG.rdoc +7 -0
- data/README.rdoc +5 -0
- data/ext/rbczmq/frame.c +6 -2
- data/ext/rbczmq/message.c +20 -10
- data/lib/zmq/version.rb +1 -1
- data/rbczmq.gemspec +1 -0
- data/test/test_message.rb +10 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTYzNjRlZGJiYTMyN2NhZDQ4OTM4MmRjMzEzODM4NjIzYzA2NTE2Mw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTNmNWY3NzBhMDRlOWI4MGFkNjc5NTVlZDFkY2RhMjRhMTZhM2QyMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjRiOTYyZTlmNjY0NzVlYjdmYzNiZjZjZWVmMWZiYmUyYmJlZmNhZTYwYjky
|
10
|
+
MjM0OTFmMzAxMjA4ZDBkMDM5ZGUyYTg3ZjYwYTk2OTIzOTAxMzA2MjI3NWJm
|
11
|
+
YjAxNGJiN2M0MDAzNzQyYTMyMWFmY2MxYzQ1MDRmODI4OTI3Njg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWFjYzEyNDU2OTBmMjM2NjFmY2Y1MzY3MjhhNjIzMTdiMDkwZTgzYjYyNjlj
|
14
|
+
OGRmNzEyY2QyMzczMDhhZWIyY2I0NmViNGNjOTY0MjYwM2UwYTA0ZjMxOTI4
|
15
|
+
NWI2YmJjNjFmNWI5NTQwOWU3Mzc0NmVjYTkyZTEzZGM2MDlkNWM=
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== 1.7.1 (July 25, 2013)
|
4
|
+
|
5
|
+
* FIX: ZMQ::Message#pop did not relase ownership of frame.
|
6
|
+
* FIX: !Important! ZMQ::Message was not marking owned ZMQ::Frame objects, leading to potential GC crash in 1.7.0.
|
7
|
+
* FIX: Fixed memory leak in ZMQ::Message.
|
8
|
+
* Updated license in gemspec and readme.
|
9
|
+
|
3
10
|
== 1.7.0 (July 21, 2013)
|
4
11
|
|
5
12
|
* ZMQ::Frame - Implemented an interal wrapper around the underlying czmq frame objects to better manage memory and object ownership. (Matt Connolly)
|
data/README.rdoc
CHANGED
@@ -232,6 +232,11 @@ You can get those with brew packaging system:
|
|
232
232
|
|
233
233
|
brew install libtool autoconf automake
|
234
234
|
|
235
|
+
== LICENSE
|
236
|
+
|
237
|
+
The rbczmq gem is licensed under the MIT license. See the file "MIT-LICENSE" for details.
|
238
|
+
This gem uses the "zmq" and "czmq" libraries, both of which are licensed under the LGPL license.
|
239
|
+
|
235
240
|
== TODO
|
236
241
|
|
237
242
|
* ZMQ::Message#save && ZMQ::Message.load
|
data/ext/rbczmq/frame.c
CHANGED
@@ -28,10 +28,11 @@ VALUE rb_czmq_alloc_frame(zframe_t *frame)
|
|
28
28
|
*/
|
29
29
|
void rb_czmq_free_frame(zmq_frame_wrapper *frame)
|
30
30
|
{
|
31
|
-
if (frame
|
31
|
+
if (frame->frame && (frame->flags & ZMQ_FRAME_OWNED) != 0) {
|
32
32
|
zframe_destroy(&frame->frame);
|
33
33
|
frame->flags &= ~ZMQ_FRAME_OWNED;
|
34
34
|
}
|
35
|
+
frame->frame = NULL;
|
35
36
|
}
|
36
37
|
|
37
38
|
/*
|
@@ -42,7 +43,10 @@ void rb_czmq_free_frame(zmq_frame_wrapper *frame)
|
|
42
43
|
void rb_czmq_free_frame_gc(void *ptr)
|
43
44
|
{
|
44
45
|
zmq_frame_wrapper *frame = (zmq_frame_wrapper *)ptr;
|
45
|
-
|
46
|
+
if (frame) {
|
47
|
+
rb_czmq_free_frame(frame);
|
48
|
+
xfree(frame);
|
49
|
+
}
|
46
50
|
}
|
47
51
|
|
48
52
|
/*
|
data/ext/rbczmq/message.c
CHANGED
@@ -8,10 +8,14 @@
|
|
8
8
|
void rb_czmq_free_message(zmq_message_wrapper *message)
|
9
9
|
{
|
10
10
|
errno = 0;
|
11
|
-
|
11
|
+
|
12
|
+
if (message->message != NULL && message->flags & ZMQ_MESSAGE_OWNED) {
|
12
13
|
zmsg_destroy(&message->message);
|
13
|
-
message->message = NULL;
|
14
14
|
message->flags &= ~ZMQ_MESSAGE_OWNED;
|
15
|
+
}
|
16
|
+
message->message = NULL;
|
17
|
+
|
18
|
+
if (message->frames) {
|
15
19
|
zlist_destroy(&message->frames);
|
16
20
|
}
|
17
21
|
}
|
@@ -36,10 +40,12 @@ static void rb_czmq_free_message_gc(void *ptr)
|
|
36
40
|
*/
|
37
41
|
void rb_czmq_mark_message(zmq_message_wrapper *message)
|
38
42
|
{
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
if (message->frames) {
|
44
|
+
VALUE frame = (VALUE)zlist_first(message->frames);
|
45
|
+
while (frame) {
|
46
|
+
rb_gc_mark(frame);
|
47
|
+
frame = (VALUE)zlist_next(message->frames);
|
48
|
+
}
|
43
49
|
}
|
44
50
|
}
|
45
51
|
|
@@ -53,7 +59,7 @@ VALUE rb_czmq_alloc_message(zmsg_t *message)
|
|
53
59
|
VALUE message_obj;
|
54
60
|
zmq_message_wrapper *m = NULL;
|
55
61
|
errno = 0;
|
56
|
-
message_obj = Data_Make_Struct(rb_cZmqMessage, zmq_message_wrapper,
|
62
|
+
message_obj = Data_Make_Struct(rb_cZmqMessage, zmq_message_wrapper, rb_czmq_mark_message, rb_czmq_free_message_gc, m);
|
57
63
|
m->message = message;
|
58
64
|
ZmqAssertObjOnAlloc(m->message, m);
|
59
65
|
m->flags = ZMQ_MESSAGE_OWNED;
|
@@ -217,12 +223,16 @@ static VALUE rb_czmq_message_add(VALUE obj, VALUE frame_obj)
|
|
217
223
|
|
218
224
|
static VALUE rb_czmq_message_pop(VALUE obj)
|
219
225
|
{
|
220
|
-
zframe_t *
|
226
|
+
zframe_t *zframe = NULL;
|
221
227
|
ZmqGetMessage(obj);
|
222
228
|
ZmqAssertMessageOwned(message);
|
223
|
-
|
224
|
-
if (
|
229
|
+
zframe = zmsg_pop(message->message); /* we now own the frame */
|
230
|
+
if (zframe == NULL) return Qnil;
|
225
231
|
VALUE frame_obj = (VALUE)zlist_pop(message->frames);
|
232
|
+
/* detach frame from message, it is now owned by the ruby object */
|
233
|
+
ZmqGetFrame(frame_obj);
|
234
|
+
frame->flags |= ZMQ_FRAME_OWNED;
|
235
|
+
frame->message = NULL;
|
226
236
|
return frame_obj ? frame_obj : Qnil;
|
227
237
|
}
|
228
238
|
|
data/lib/zmq/version.rb
CHANGED
data/rbczmq.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.authors = ["Lourens Naudé", "James Tucker", "Matt Connolly"]
|
11
11
|
s.email = ["lourens@methodmissing.com", "jftucker@gmail.com", "matt.connolly@me.com"]
|
12
12
|
s.homepage = "http://github.com/methodmissing/rbczmq"
|
13
|
+
s.license = 'MIT'
|
13
14
|
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
14
15
|
s.platform = Gem::Platform::RUBY
|
15
16
|
s.extensions = "ext/rbczmq/extconf.rb"
|
data/test/test_message.rb
CHANGED
@@ -291,4 +291,14 @@ class TestZmqMessage < ZmqTestCase
|
|
291
291
|
ensure
|
292
292
|
ctx.destroy
|
293
293
|
end
|
294
|
+
|
295
|
+
def test_pop_ownership
|
296
|
+
msg = ZMQ::Message.new
|
297
|
+
other = ZMQ::Message.new
|
298
|
+
msg.pushstr "hello"
|
299
|
+
frame = msg.pop
|
300
|
+
other.push frame
|
301
|
+
assert_equal 1, other.size
|
302
|
+
end
|
303
|
+
|
294
304
|
end
|
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.
|
4
|
+
version: 1.7.1
|
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-07-
|
13
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake-compiler
|
@@ -527,7 +527,8 @@ files:
|
|
527
527
|
- ext/zeromq/tests/testutil.hpp
|
528
528
|
- ext/zeromq/version.sh
|
529
529
|
homepage: http://github.com/methodmissing/rbczmq
|
530
|
-
licenses:
|
530
|
+
licenses:
|
531
|
+
- MIT
|
531
532
|
metadata: {}
|
532
533
|
post_install_message:
|
533
534
|
rdoc_options:
|