/** * call-seq: * Rev::Watcher.attach(loop) -> Rev::Watcher * * Attach the watcher to the given Rev::Loop. If the watcher is already attached * to a loop, detach it from the old one and attach it to the new one. */ static VALUE Rev_Watcher_attach(VALUE self, VALUE loop) { VALUE loop_watchers, active_watchers; loop_watchers = rb_iv_get(loop, "@watchers"); if(loop_watchers == Qnil) { loop_watchers = rb_ary_new(); rb_iv_set(loop, "@watchers", loop_watchers); } /* Add us to the loop's array of active watchers. This is mainly done * to keep the VM from garbage collecting watchers that are associated * with a loop (and also lets you see within Ruby which watchers are * associated with a given loop), but isn't really necessary for any * other reason */ rb_ary_push(loop_watchers, self); active_watchers = rb_iv_get(loop, "@active_watchers"); if(active_watchers == Qnil) active_watchers = INT2NUM(1); else active_watchers = INT2NUM(NUM2INT(active_watchers) + 1); rb_iv_set(loop, "@active_watchers", active_watchers); return self; }