@@ -167,6 +167,14 @@ def initialize(*args)
167
167
@read_thread = nil
168
168
@write_semaphore = Mutex . new
169
169
@pubacks_semaphore = Mutex . new
170
+
171
+ @wait_for_read_func = method (
172
+ if OpenSSL ::SSL ::SSLSocket . method_defined? ( :read_nonblock )
173
+ :nonblocking_read_before_select
174
+ else
175
+ :select_without_nonblocking_read
176
+ end
177
+ )
170
178
end
171
179
172
180
# Get the OpenSSL context, that is used if SSL/TLS is enabled
@@ -438,9 +446,12 @@ def unsubscribe(*topics)
438
446
439
447
private
440
448
441
- # Try to read a packet from the server
442
- # Also sends keep-alive ping packets.
443
- def receive_packet
449
+ def select_without_nonblocking_read
450
+ # Poll socket - is there data waiting?
451
+ [ nil , !IO . select ( [ @socket ] , [ ] , [ ] , SELECT_TIMEOUT ) . nil? ]
452
+ end
453
+
454
+ def nonblocking_read_before_select
444
455
first_byte_in_packet = nil
445
456
data_available_to_read = false
446
457
begin
@@ -456,6 +467,13 @@ def receive_packet
456
467
[ @socket ] , [ ] , [ ] , SELECT_TIMEOUT
457
468
) . nil?
458
469
end
470
+ [ first_byte_in_packet , data_available_to_read ]
471
+ end
472
+
473
+ # Try to read a packet from the server
474
+ # Also sends keep-alive ping packets.
475
+ def receive_packet
476
+ first_byte_in_packet , data_available_to_read = @wait_for_read_func . call
459
477
if data_available_to_read
460
478
# Yes - read in the packet
461
479
packet = MQTT ::Packet . read ( @socket , first_byte_in_packet )
0 commit comments