Class: Coolio::Loop

Inherits:
Object
  • Object
show all
Defined in:
lib/cool.io/loop.rb,
ext/cool.io/loop.c,
ext/cool.io/iowatcher.c,
ext/cool.io/stat_watcher.c,
ext/cool.io/timer_watcher.c

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Loop

Create a new Coolio::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)

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/cool.io/loop.rb', line 41

def initialize(options = {})
  @watchers = {}
  @active_watchers = 0

  flags = 0

  options.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

.defaultObject

Retrieve the default event loop for the current thread


19
20
21
# File 'lib/cool.io/loop.rb', line 19

def self.default
  Thread.current._coolio_loop
end

Instance Method Details

#attach(watcher) ⇒ Object

Attach a watcher to the loop


73
74
75
# File 'lib/cool.io/loop.rb', line 73

def attach(watcher)
  watcher.attach self
end

#has_active_watchers?Boolean

Does the loop have any active watchers?

Returns:

  • (Boolean)

100
101
102
# File 'lib/cool.io/loop.rb', line 100

def has_active_watchers?
  @active_watchers > 0
end

#run(timeout = nil) ⇒ 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.

Raises:

  • (RuntimeError)

83
84
85
86
87
88
89
90
91
# File 'lib/cool.io/loop.rb', line 83

def run(timeout = nil)
  raise RuntimeError, "no watchers for this loop" if @watchers.empty?

  @running = true
  while @running and not @active_watchers.zero?
    run_once(timeout)
  end
  @running = false
end

#run_nonblockObject


22
# File 'ext/cool.io/loop.c', line 22

static VALUE Coolio_Loop_run_nonblock(VALUE self);

#run_onceObject


21
# File 'ext/cool.io/loop.c', line 21

static VALUE Coolio_Loop_run_once(int argc, VALUE *argv, VALUE self);

#stopObject

Stop the event loop if it's running

Raises:

  • (RuntimeError)

94
95
96
97
# File 'lib/cool.io/loop.rb', line 94

def stop
  raise RuntimeError, "loop not running" unless @running
  @running = false
end

#watchersObject

All watchers attached to the current loop


105
106
107
# File 'lib/cool.io/loop.rb', line 105

def watchers
  @watchers.keys
end