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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3e5938035e1b344dafa25665293cddc9017c5b9c47280bacc9fc4b9ff97fc2e
4
- data.tar.gz: 16b1a7896a2f118cfd2fcfa2829acbeb5e3d021472c34aa6dfd190ed8bb1a5bf
3
+ metadata.gz: e3c85c43224c3d6b657fdc1178c3dc145bae175ab4febd29194717074509c3e0
4
+ data.tar.gz: 70b7dd7ed91196fa9c24bd911be6d30f5c5f9c3b5a55f70c8a78f4cfbbb8d74c
5
5
  SHA512:
6
- metadata.gz: 5e6058194cbb28727e78f92a431c203ee45f5363a89e4fbaa3026553d3b3b8610240947b7336f5625218458acd77388038734b00a966c8f6fa3ac7c45d9616a0
7
- data.tar.gz: b549f127a5031b643807702ee279a0dc4565f252c3489b10da5f6191617162f618946518175e3bb4de4c3c7b1628fb355ad5c063f31c2b05c34bf93c07d15f2c
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, false)
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 (not owned, no finalizer).
478
+ # Wraps a borrowed zframe_t pointer and retains its owning message.
477
479
  #
478
- def self._from_ptr(ptr, _owned = false)
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
- prevent_leak_ptr = ::FFI::MemoryPointer.new(:pointer)
50
- prevent_leak_ptr.write_pointer(@actor_ptr)
51
- ObjectSpace.define_finalizer(self, self.class._make_destructor(prevent_leak_ptr))
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CZTop
4
4
 
5
- VERSION = '2.0.3'
5
+ VERSION = '2.0.4'
6
6
 
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cztop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Wenger