Class: Libevent::Signal

Inherits:
Object
  • Object
show all
Defined in:
lib/libevent/signal.rb,
ext/libevent_ext/signal.c

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Object) initialize

Note:

method allocates memory for struct event that will be freed when object will be freed by ruby' GC

Create and add signal to specified event base with handler block

Parameters:

  • base (Base)

    event base instance

  • name (String)

    a name of signal

  • handler (Object)

    object that perform signal handling. Any object that responds to :call method



# File 'ext/libevent_ext/signal.c'

static VALUE t_initialize(VALUE self, VALUE base, VALUE name, VALUE handler) {
  Libevent_Signal *le_signal;
  Libevent_Base *le_base;
  VALUE signal_list;
  VALUE signal_number;

  Data_Get_Struct(self, Libevent_Signal, le_signal);
  Data_Get_Struct(base, Libevent_Base, le_base);

  // check name
  signal_list = rb_funcall( rb_const_get(rb_cObject, rb_intern("Signal")), rb_intern("list"), 0);
  signal_number = rb_hash_aref(signal_list, name);
  if ( signal_number == Qnil )
    rb_raise(rb_eArgError, "unknown signal name given");
  rb_iv_set(self, "@name", name);

  // check handler
  if ( !rb_respond_to(handler, rb_intern("call")))
    rb_raise(rb_eArgError, "handler does not response to call method");
  rb_iv_set(self, "@handler", handler);

  // create signal event
  le_signal->ev_event = evsignal_new(le_base->ev_base, FIX2INT(signal_number), t_handler, (void *)handler);
  if ( !le_signal->ev_event )
    rb_fatal("Could not create a signal event");
  if ( event_add(le_signal->ev_event, NULL) < 0 )
    rb_fatal("Could not add a signal event");

  return self;
}

Instance Attribute Details

- (Object) name (readonly)

Returns the value of attribute name



3
4
5
# File 'lib/libevent/signal.rb', line 3

def name
  @name
end

Instance Method Details

- (true, false) destroy

Delete signal from event base

Returns:

  • (true)

    on success

  • (false)

    on failure



# File 'ext/libevent_ext/signal.c'

static VALUE t_destroy(VALUE self) {
  Libevent_Signal *le_signal;
  int status;

  Data_Get_Struct(self, Libevent_Signal, le_signal);
  status = event_del(le_signal->ev_event);

  return( status == -1 ? Qfalse : Qtrue);
}