Class: Rev::Loop
- Inherits:
-
Object
- Object
- Rev::Loop
- Defined in:
- lib/rev/loop.rb,
ext/rev/rev_loop.c,
ext/rev/rev_io_watcher.c,
ext/rev/rev_stat_watcher.c,
ext/rev/rev_timer_watcher.c
Class Method Summary collapse
-
.default ⇒ Object
Retrieve the default event loop.
Instance Method Summary collapse
-
#attach(watcher) ⇒ Object
Attach a watcher to the loop.
-
#has_active_watchers? ⇒ Boolean
Does the loop have any active watchers?.
-
#initialize(options = {}) ⇒ Loop
constructor
Create a new Rev::Loop.
-
#run ⇒ Object
Run the event loop and dispatch events back to Ruby.
- #run_nonblock ⇒ Object
- #run_once ⇒ Object
-
#stop ⇒ Object
Stop the event loop if it’s running.
-
#watchers ⇒ Object
All watchers attached to the current loop.
Constructor Details
#initialize(options = {}) ⇒ Loop
Create a new Rev::Loop
Options:
:skip_environment (boolean)
Ignore the $LIBEV_FLAGS environment variable
:fork_check (boolean)
Enable autodetection of forks
:backend
Choose the default backend, one (or many in an array) of:
:select (most platforms)
:poll (most platforms except Windows)
:epoll (Linux)
:kqueue (BSD/Mac OS X)
:port (Solaris 10)
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/rev/loop.rb', line 49 def initialize( = {}) @watchers = {} @active_watchers = 0 flags = 0 .each do |option, value| case option when :skip_environment flags |= EVFLAG_NOEV if value when :fork_check flags |= EVFLAG_FORKCHECK if value when :backend value = [value] unless value.is_a? Array value.each do |backend| case backend when :select then flags |= EVBACKEND_SELECT when :poll then flags |= EVBACKEND_POLL when :epoll then flags |= EVBACKEND_EPOLL when :kqueue then flags |= EVBACKEND_KQUEUE when :port then flags |= EVBACKEND_PORT else raise ArgumentError, "no such backend: #{backend}" end end else raise ArgumentError, "no such option: #{option}" end end @loop = ev_loop_new(flags) end |
Class Method Details
.default ⇒ Object
Retrieve the default event loop
21 22 23 |
# File 'lib/rev/loop.rb', line 21 def self.default Thread.current._rev_loop end |
Instance Method Details
#attach(watcher) ⇒ Object
Attach a watcher to the loop
81 82 83 |
# File 'lib/rev/loop.rb', line 81 def attach(watcher) watcher.attach self end |
#has_active_watchers? ⇒ Boolean
Does the loop have any active watchers?
108 109 110 |
# File 'lib/rev/loop.rb', line 108 def has_active_watchers? @active_watchers > 0 end |
#run ⇒ Object
Run the event loop and dispatch events back to Ruby. If there are no watchers associated with the event loop it will return immediately. Otherwise, run will continue blocking and making event callbacks to watchers until all watchers associated with the loop have been disabled or detached. The loop may be explicitly stopped by calling the stop method on the loop object.
91 92 93 94 95 96 97 98 99 |
# File 'lib/rev/loop.rb', line 91 def run raise RuntimeError, "no watchers for this loop" if @watchers.empty? @running = true while @running and not @active_watchers.zero? run_once end @running = false end |
#run_nonblock ⇒ Object
33 |
# File 'ext/rev/rev_loop.c', line 33 static VALUE Rev_Loop_run_nonblock(VALUE self); |
#run_once ⇒ Object
32 |
# File 'ext/rev/rev_loop.c', line 32 static VALUE Rev_Loop_run_once(VALUE self); |
#stop ⇒ Object
Stop the event loop if it’s running
102 103 104 105 |
# File 'lib/rev/loop.rb', line 102 def stop raise RuntimeError, "loop not running" unless @running @running = false end |
#watchers ⇒ Object
All watchers attached to the current loop
113 114 115 |
# File 'lib/rev/loop.rb', line 113 def watchers @watchers.keys end |