|
2 | 2 |
|
3 | 3 | module Rdkafka |
4 | 4 | module Callbacks |
5 | | - |
6 | 5 | # Extracts attributes of a rd_kafka_topic_result_t |
7 | 6 | # |
8 | 7 | # @private |
@@ -149,13 +148,6 @@ def initialize(event_ptr) |
149 | 148 | end |
150 | 149 | end |
151 | 150 |
|
152 | | - # FFI Function used for Create Topic and Delete Topic callbacks |
153 | | - BackgroundEventCallbackFunction = FFI::Function.new( |
154 | | - :void, [:pointer, :pointer, :pointer] |
155 | | - ) do |client_ptr, event_ptr, opaque_ptr| |
156 | | - BackgroundEventCallback.call(client_ptr, event_ptr, opaque_ptr) |
157 | | - end |
158 | | - |
159 | 151 | # @private |
160 | 152 | class BackgroundEventCallback |
161 | 153 | def self.call(_, event_ptr, _) |
@@ -348,13 +340,6 @@ def self.process_describe_acl(event_ptr) |
348 | 340 | end |
349 | 341 | end |
350 | 342 |
|
351 | | - # FFI Function used for Message Delivery callbacks |
352 | | - DeliveryCallbackFunction = FFI::Function.new( |
353 | | - :void, [:pointer, :pointer, :pointer] |
354 | | - ) do |client_ptr, message_ptr, opaque_ptr| |
355 | | - DeliveryCallback.call(client_ptr, message_ptr, opaque_ptr) |
356 | | - end |
357 | | - |
358 | 343 | # @private |
359 | 344 | class DeliveryCallback |
360 | 345 | def self.call(_, message_ptr, opaque_ptr) |
@@ -387,5 +372,44 @@ def self.call(_, message_ptr, opaque_ptr) |
387 | 372 | end |
388 | 373 | end |
389 | 374 | end |
| 375 | + |
| 376 | + @@mutex = Mutex.new |
| 377 | + @@current_pid = nil |
| 378 | + |
| 379 | + class << self |
| 380 | + # Defines or recreates after fork callbacks that require FFI thread so the callback thread |
| 381 | + # is always correctly initialized |
| 382 | + # |
| 383 | + # @see https://github.com/ffi/ffi/issues/1114 |
| 384 | + def ensure_ffi_running |
| 385 | + @@mutex.synchronize do |
| 386 | + return if @@current_pid == ::Process.pid |
| 387 | + |
| 388 | + if const_defined?(:BackgroundEventCallbackFunction, false) |
| 389 | + send(:remove_const, :BackgroundEventCallbackFunction) |
| 390 | + send(:remove_const, :DeliveryCallbackFunction) |
| 391 | + end |
| 392 | + |
| 393 | + # FFI Function used for Create Topic and Delete Topic callbacks |
| 394 | + background_event_callback_function = FFI::Function.new( |
| 395 | + :void, [:pointer, :pointer, :pointer] |
| 396 | + ) do |client_ptr, event_ptr, opaque_ptr| |
| 397 | + BackgroundEventCallback.call(client_ptr, event_ptr, opaque_ptr) |
| 398 | + end |
| 399 | + |
| 400 | + # FFI Function used for Message Delivery callbacks |
| 401 | + delivery_callback_function = FFI::Function.new( |
| 402 | + :void, [:pointer, :pointer, :pointer] |
| 403 | + ) do |client_ptr, message_ptr, opaque_ptr| |
| 404 | + DeliveryCallback.call(client_ptr, message_ptr, opaque_ptr) |
| 405 | + end |
| 406 | + |
| 407 | + const_set(:BackgroundEventCallbackFunction, background_event_callback_function) |
| 408 | + const_set(:DeliveryCallbackFunction, delivery_callback_function) |
| 409 | + |
| 410 | + @@current_pid = ::Process.pid |
| 411 | + end |
| 412 | + end |
| 413 | + end |
390 | 414 | end |
391 | 415 | end |
0 commit comments