Class: Channel

Inherits:
Object
  • Object
show all
Defined in:
ext/channel/channel.c

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'ext/channel/channel.c', line 58

static VALUE 
rb_channel_initialize( int argc, VALUE *argv, VALUE ch )
{
    VALUE size, defer;
    int channel_size, def;  
    rb_scan_args(argc, argv, "02", &size, &defer);
    channel_size = NIL_P(size) ? 0 : FIX2INT(size);
    def = (defer == Qtrue) ? 1 : 0;  
    return rb_channel_new(ch, channel_size, def); 
}

Instance Method Details

#<<(obj) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'ext/channel/channel.c', line 112

static VALUE 
rb_channel_push( VALUE ch, VALUE obj )
{
    void *args[3]; 
    RChannel* chs = GetChannelStruct(ch);
    if (chs->defer == 1){
      args[0] = chs;
      args[1] = &ch;
      args[2] = &obj;
      rb_thread_create( rb_channel_push0, &args);
    }else{
      rb_channel_push0(chs,&ch,&obj);
    }
    return ch;
}

#deferrable?Boolean

Returns:

  • (Boolean)


83
84
85
86
87
88
# File 'ext/channel/channel.c', line 83

static VALUE 
rb_channel_deferrable_p( VALUE ch )
{
    RChannel* chs = GetChannelStruct(ch);    
    return (chs->defer == 1) ? Qtrue : Qfalse; 
}

#sizeObject



69
70
71
72
73
74
# File 'ext/channel/channel.c', line 69

static VALUE 
rb_channel_size( VALUE ch )
{
    RChannel* chs = GetChannelStruct(ch);    
    return INT2FIX(chs->size); 
}

#subscribe(*args) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
# File 'ext/channel/channel.c', line 90

static VALUE 
rb_channel_subscribe( int argc, VALUE *argv, VALUE ch )
{
    VALUE cb;
    RChannel* chs = GetChannelStruct(ch);    
    if (!rb_block_given_p()) rb_raise(rb_eArgError, "Block callback required!");
    if (chs->sbs == chs->size) rb_raise(rb_eArgError, "Maximum number of subscribers exceeded!");
    cb = rb_block_proc();
    chs->subscribers[chs->sbs] = cb;
    chs->sbs++;
    return ch;
}

#subscribersObject



76
77
78
79
80
81
# File 'ext/channel/channel.c', line 76

static VALUE 
rb_channel_subscribers( VALUE ch )
{
    RChannel* chs = GetChannelStruct(ch);    
    return INT2FIX(chs->sbs); 
}