cztop 2.0.3 → 2.0.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 +4 -4
- data/CHANGES.md +10 -0
- data/lib/cztop/ffi.rb +15 -10
- data/lib/cztop/monitor.rb +4 -6
- data/lib/cztop/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e3c85c43224c3d6b657fdc1178c3dc145bae175ab4febd29194717074509c3e0
|
|
4
|
+
data.tar.gz: 70b7dd7ed91196fa9c24bd911be6d30f5c5f9c3b5a55f70c8a78f4cfbbb8d74c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 34a251ab8bd12c5220dea4627f7cf3823d0aaf590da6875ba182d92107defd17a68100e638d8feca6b348608585d80f0002af77dfb8f34c68cc7d00fd5af2cb0
|
|
7
|
+
data.tar.gz: 70ee8e3f715ab38d820e48919e0c7e8608cdcd836383ed969ec712447b14db74b7706cc9b7e86d40f9c1b71ec2d2300a3287cdbc39edbb6270e1e00576e6d9b5
|
data/CHANGES.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
2.0.4
|
|
4
|
+
-----
|
|
5
|
+
|
|
6
|
+
* Prevent socket double destruction by removing finalizers before native cleanup
|
|
7
|
+
and sharing their pointer holders with explicit destruction
|
|
8
|
+
* Prevent monitor double destruction with the same finalizer cleanup ordering
|
|
9
|
+
and shared pointer holder
|
|
10
|
+
* Keep parent messages alive while borrowed frames remain live, and reject frame
|
|
11
|
+
access after message ownership is transferred
|
|
12
|
+
|
|
3
13
|
2.0.3
|
|
4
14
|
-----
|
|
5
15
|
|
data/lib/cztop/ffi.rb
CHANGED
|
@@ -172,8 +172,8 @@ module CZMQ
|
|
|
172
172
|
end
|
|
173
173
|
|
|
174
174
|
module ClassMethods
|
|
175
|
-
def prevent_leak(ptr, destroy_fn)
|
|
176
|
-
prevent_leak_ptr = ::FFI::MemoryPointer.new(:pointer)
|
|
175
|
+
def prevent_leak(ptr, destroy_fn, ptr_ref: nil)
|
|
176
|
+
prevent_leak_ptr = ptr_ref || ::FFI::MemoryPointer.new(:pointer)
|
|
177
177
|
prevent_leak_ptr.write_pointer(ptr)
|
|
178
178
|
prevent_leak_fn = destroy_fn
|
|
179
179
|
->(id) { CZMQ::FFI.__send__(prevent_leak_fn, prevent_leak_ptr) }
|
|
@@ -264,10 +264,11 @@ module CZMQ
|
|
|
264
264
|
|
|
265
265
|
def initialize(type)
|
|
266
266
|
@ptr = CZMQ::FFI.zsock_new(type)
|
|
267
|
+
@ptr_ref = ::FFI::MemoryPointer.new(:pointer)
|
|
267
268
|
@moved = false
|
|
268
269
|
unless @ptr.null?
|
|
269
270
|
ObjectSpace.define_finalizer(self,
|
|
270
|
-
self.class.prevent_leak(@ptr, :zsock_destroy))
|
|
271
|
+
self.class.prevent_leak(@ptr, :zsock_destroy, ptr_ref: @ptr_ref))
|
|
271
272
|
end
|
|
272
273
|
end
|
|
273
274
|
|
|
@@ -287,11 +288,13 @@ module CZMQ
|
|
|
287
288
|
|
|
288
289
|
def self._wrap(ptr)
|
|
289
290
|
obj = allocate
|
|
291
|
+
ptr_ref = ::FFI::MemoryPointer.new(:pointer)
|
|
290
292
|
obj.instance_variable_set(:@ptr, ptr)
|
|
293
|
+
obj.instance_variable_set(:@ptr_ref, ptr_ref)
|
|
291
294
|
obj.instance_variable_set(:@moved, false)
|
|
292
295
|
unless ptr.null?
|
|
293
296
|
ObjectSpace.define_finalizer(obj,
|
|
294
|
-
prevent_leak(ptr, :zsock_destroy))
|
|
297
|
+
prevent_leak(ptr, :zsock_destroy, ptr_ref: ptr_ref))
|
|
295
298
|
end
|
|
296
299
|
obj
|
|
297
300
|
end
|
|
@@ -320,11 +323,10 @@ module CZMQ
|
|
|
320
323
|
|
|
321
324
|
def destroy
|
|
322
325
|
return if @moved
|
|
323
|
-
ptr_ptr = ::FFI::MemoryPointer.new(:pointer)
|
|
324
|
-
ptr_ptr.write_pointer(@ptr)
|
|
325
|
-
CZMQ::FFI.zsock_destroy(ptr_ptr)
|
|
326
326
|
@moved = true
|
|
327
327
|
ObjectSpace.undefine_finalizer(self)
|
|
328
|
+
# Native destruction releases the GVL and nulls the finalizer's reference.
|
|
329
|
+
CZMQ::FFI.zsock_destroy(@ptr_ref)
|
|
328
330
|
end
|
|
329
331
|
|
|
330
332
|
def set_subscribe(prefix)
|
|
@@ -465,7 +467,7 @@ module CZMQ
|
|
|
465
467
|
|
|
466
468
|
# Returns a Zframe that does NOT own the pointer (borrowed from zmsg).
|
|
467
469
|
def _borrowed_frame(ptr)
|
|
468
|
-
Zframe._from_ptr(ptr,
|
|
470
|
+
Zframe._from_ptr(ptr, owner: self)
|
|
469
471
|
end
|
|
470
472
|
end
|
|
471
473
|
|
|
@@ -473,19 +475,22 @@ module CZMQ
|
|
|
473
475
|
# Zframe (lightweight; only used for borrowed frames from Zmsg)
|
|
474
476
|
# -----------------------------------------------------------------
|
|
475
477
|
class Zframe
|
|
476
|
-
# Wraps a borrowed zframe_t pointer
|
|
478
|
+
# Wraps a borrowed zframe_t pointer and retains its owning message.
|
|
477
479
|
#
|
|
478
|
-
def self._from_ptr(ptr,
|
|
480
|
+
def self._from_ptr(ptr, owner:)
|
|
479
481
|
obj = allocate
|
|
480
482
|
obj.instance_variable_set(:@ptr, ptr)
|
|
483
|
+
obj.instance_variable_set(:@owner, owner)
|
|
481
484
|
obj
|
|
482
485
|
end
|
|
483
486
|
|
|
484
487
|
def data
|
|
488
|
+
@owner.to_ptr
|
|
485
489
|
CZMQ::FFI.zframe_data(@ptr)
|
|
486
490
|
end
|
|
487
491
|
|
|
488
492
|
def size
|
|
493
|
+
@owner.to_ptr
|
|
489
494
|
CZMQ::FFI.zframe_size(@ptr)
|
|
490
495
|
end
|
|
491
496
|
end
|
data/lib/cztop/monitor.rb
CHANGED
|
@@ -46,9 +46,9 @@ module CZTop
|
|
|
46
46
|
|
|
47
47
|
@closed = false
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
ObjectSpace.define_finalizer(self, self.class._make_destructor(
|
|
49
|
+
@actor_ref = ::FFI::MemoryPointer.new(:pointer)
|
|
50
|
+
@actor_ref.write_pointer(@actor_ptr)
|
|
51
|
+
ObjectSpace.define_finalizer(self, self.class._make_destructor(@actor_ref))
|
|
52
52
|
|
|
53
53
|
CZMQ::FFI.zstr_send(@actor_ptr, 'VERBOSE') if verbose
|
|
54
54
|
|
|
@@ -103,11 +103,9 @@ module CZTop
|
|
|
103
103
|
def close
|
|
104
104
|
return if @closed
|
|
105
105
|
|
|
106
|
-
pp = ::FFI::MemoryPointer.new(:pointer)
|
|
107
|
-
pp.write_pointer(@actor_ptr)
|
|
108
|
-
CZMQ::FFI.zactor_destroy(pp)
|
|
109
106
|
@closed = true
|
|
110
107
|
ObjectSpace.undefine_finalizer(self)
|
|
108
|
+
CZMQ::FFI.zactor_destroy(@actor_ref)
|
|
111
109
|
end
|
|
112
110
|
|
|
113
111
|
|
data/lib/cztop/version.rb
CHANGED