Class: Ever::Loop
- Inherits:
-
Object
- Object
- Ever::Loop
- Defined in:
- ext/ever/loop.c
Instance Method Summary collapse
- #each ⇒ Object
- #emit(key) ⇒ Object
-
#initialize ⇒ Object
constructor
of a blocking event loop (waking it up) in a thread-safe, signal-safe manner.
- #next_event ⇒ Object
- #signal ⇒ Object
- #stop ⇒ Object
- #unwatch(key) ⇒ Object
- #watch_fd(key, fd, rw, oneshot) ⇒ Object
- #watch_io(key, io, rw, oneshot) ⇒ Object
- #watch_timer(key, timeout, interval) ⇒ Object
Constructor Details
#initialize ⇒ Object
of a blocking event loop (waking it up) in a thread-safe, signal-safe manner
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'ext/ever/loop.c', line 117
static VALUE Loop_initialize(VALUE self) {
Loop_t *loop;
GetLoop(self, loop);
loop->ev_loop = ev_loop_new(EVFLAG_NOSIGMASK);
// start async watcher used for breaking a poll op (from another thread)
ev_async_init(&loop->break_async, break_async_callback);
ev_async_start(loop->ev_loop, &loop->break_async);
// the break_async watcher is unreferenced, in order for Loop_poll to not
// block when no other watcher is active
ev_unref(loop->ev_loop);
loop->active_watchers = rb_hash_new();
loop->free_watchers = rb_ary_new();
loop->queued_events = rb_ary_new();
loop->stop = 0;
loop->in_ev_loop = 0;
return Qnil;
}
|
Instance Method Details
#each ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 |
# File 'ext/ever/loop.c', line 139
VALUE Loop_each(VALUE self) {
Loop_t *loop;
GetLoop(self, loop);
loop->stop = 0;
while (!loop->stop) {
if (RARRAY_LEN(loop->queued_events) == 0) loop_run_ev_loop(loop);
loop_yield_queued_events(loop);
}
return self;
}
|
#emit(key) ⇒ Object
159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'ext/ever/loop.c', line 159
VALUE Loop_emit(VALUE self, VALUE key) {
Loop_t *loop;
GetLoop(self, loop);
if (key == SYM_stop)
loop->stop = 1;
else
rb_ary_push(loop->queued_events, key);
loop_signal(loop);
return key;
}
|
#next_event ⇒ Object
151 152 153 154 155 156 157 |
# File 'ext/ever/loop.c', line 151
VALUE Loop_next_event(VALUE self) {
Loop_t *loop;
GetLoop(self, loop);
if (RARRAY_LEN(loop->queued_events) == 0) loop_run_ev_loop(loop);
return rb_ary_shift(loop->queued_events);
}
|
#signal ⇒ Object
172 173 174 175 176 177 178 |
# File 'ext/ever/loop.c', line 172 VALUE Loop_signal(VALUE self) { Loop_t *loop; GetLoop(self, loop); loop_signal(loop); return self; } |
#stop ⇒ Object
180 181 182 183 184 185 186 187 |
# File 'ext/ever/loop.c', line 180
VALUE Loop_stop(VALUE self) {
Loop_t *loop;
GetLoop(self, loop);
loop->stop = 1;
loop_signal(loop);
return self;
}
|
#unwatch(key) ⇒ Object
222 223 224 225 226 227 228 229 230 231 232 233 |
# File 'ext/ever/loop.c', line 222
VALUE Loop_unwatch(VALUE self, VALUE key) {
Loop_t *loop;
GetLoop(self, loop);
VALUE watcher = rb_hash_delete(loop->active_watchers, key);
if (watcher == Qnil) return self;
Watcher_stop(watcher);
rb_ary_push(loop->free_watchers, watcher);
return self;
}
|
#watch_fd(key, fd, rw, oneshot) ⇒ Object
189 190 191 192 193 194 195 196 197 198 |
# File 'ext/ever/loop.c', line 189
VALUE Loop_watch_fd(VALUE self, VALUE key, VALUE fd, VALUE rw, VALUE oneshot) {
Loop_t *loop;
GetLoop(self, loop);
if (rb_hash_aref(loop->active_watchers, key) != Qnil)
rb_raise(rb_eRuntimeError, "Duplicate event key detected, event key must be unique");
loop_watch_fd(loop, key, FIX2INT(fd), sym_to_events(rw), RTEST(oneshot));
return self;
}
|
#watch_io(key, io, rw, oneshot) ⇒ Object
200 201 202 203 204 205 206 207 208 209 |
# File 'ext/ever/loop.c', line 200
VALUE Loop_watch_io(VALUE self, VALUE key, VALUE io, VALUE rw, VALUE oneshot) {
Loop_t *loop;
GetLoop(self, loop);
if (rb_hash_aref(loop->active_watchers, key) != Qnil)
rb_raise(rb_eRuntimeError, "Duplicate event key detected, event key must be unique");
loop_watch_fd(loop, key, fd_from_io(io), sym_to_events(rw), RTEST(oneshot));
return self;
}
|
#watch_timer(key, timeout, interval) ⇒ Object
211 212 213 214 215 216 217 218 219 220 |
# File 'ext/ever/loop.c', line 211
VALUE Loop_watch_timer(VALUE self, VALUE key, VALUE timeout, VALUE interval) {
Loop_t *loop;
GetLoop(self, loop);
if (rb_hash_aref(loop->active_watchers, key) != Qnil)
rb_raise(rb_eRuntimeError, "Duplicate event key detected, event key must be unique");
loop_watch_timer(loop, key, NUM2DBL(timeout), NUM2DBL(interval));
return self;
}
|