Module: LightIO::Monkey

Defined in:
lib/lightio/monkey.rb

Defined Under Namespace

Classes: PatchError

Constant Summary collapse

IO_PATCH_CONSTANTS =
%w{IO File Socket Socket::Ifaddr TCPServer TCPSocket BasicSocket Addrinfo IPSocket UDPSocket UNIXSocket UNIXServer OpenSSL::SSL::SSLSocket}.freeze
THREAD_PATCH_CONSTANTS =
%w{Thread ThreadGroup Queue SizedQueue ConditionVariable Mutex ThreadsWait}.freeze

Class Method Summary collapse

Class Method Details

.patch_all!Object



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/lightio/monkey.rb', line 12

def patch_all!
  # Fix https://github.com/socketry/lightio/issues/7
  begin
    require 'ffi'
  rescue LoadError
    nil
  end

  patch_thread!
  patch_io!
  patch_kernel!
  nil
end

.patch_io!Object



51
52
53
54
55
56
# File 'lib/lightio/monkey.rb', line 51

def patch_io!
  require 'socket'
  IO_PATCH_CONSTANTS.each {|klass_name| patch!(klass_name)}
  patch_method!(Process, :spawn, LightIO.method(:spawn).to_proc)
  nil
end

.patch_kernel!Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/lightio/monkey.rb', line 65

def patch_kernel!
  patch_kernel_method!(:sleep, LightIO.method(:sleep))
  patch_kernel_method!(:select, LightIO::Library::IO.method(:select))
  patch_kernel_method!(:open, LightIO::Library::File.method(:open).to_proc)
  patch_kernel_method!(:spawn, LightIO.method(:spawn).to_proc)
  patch_kernel_method!(:`, LightIO.method(:`).to_proc)
  patch_kernel_method!(:system, LightIO.method(:system).to_proc)
  %w{gets readline readlines}.each do |method|
    patch_kernel_method!(method.to_sym, LightIO.method(method.to_sym).to_proc)
  end
  nil
end

.patch_thread!Object



37
38
39
40
41
42
# File 'lib/lightio/monkey.rb', line 37

def patch_thread!
  require 'thread'
  THREAD_PATCH_CONSTANTS.each {|klass_name| patch!(klass_name)}
  patch_method!(Timeout, :timeout, LightIO::Timeout.method(:timeout))
  nil
end

.patched?(obj) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/lightio/monkey.rb', line 33

def patched?(obj)
  patched.key?(obj) && !patched[obj]&.empty?
end

.unpatch_all!Object



26
27
28
29
30
31
# File 'lib/lightio/monkey.rb', line 26

def unpatch_all!
  unpatch_thread!
  unpatch_io!
  unpatch_kernel!
  nil
end

.unpatch_io!Object



58
59
60
61
62
63
# File 'lib/lightio/monkey.rb', line 58

def unpatch_io!
  require 'socket'
  IO_PATCH_CONSTANTS.each {|klass_name| unpatch!(klass_name)}
  unpatch_method!(Process, :spawn)
  nil
end

.unpatch_kernel!Object



78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/lightio/monkey.rb', line 78

def unpatch_kernel!
  unpatch_kernel_method!(:sleep)
  unpatch_kernel_method!(:select)
  unpatch_kernel_method!(:open)
  unpatch_kernel_method!(:spawn)
  unpatch_kernel_method!(:`)
  unpatch_kernel_method!(:system)
  %w{gets readline readlines}.each do |method|
    unpatch_kernel_method!(method.to_sym, LightIO.method(method.to_sym).to_proc)
  end
  nil
end

.unpatch_thread!Object



44
45
46
47
48
49
# File 'lib/lightio/monkey.rb', line 44

def unpatch_thread!
  require 'thread'
  THREAD_PATCH_CONSTANTS.each {|klass_name| unpatch!(klass_name)}
  unpatch_method!(Timeout, :timeout)
  nil
end