Beispiel #1
0
Datei: chan.c Projekt: irr/chan
static int chan_can_recv(chan_t* chan)
{
    if (chan_is_buffered(chan))
    {
        return chan_size(chan) > 0;
    }

    pthread_mutex_lock(chan->pipe->mu);
    int sender = chan->pipe->sender;
    pthread_mutex_unlock(chan->pipe->mu);
    return sender;
}
Beispiel #2
0
Datei: main.c Projekt: wuwx/simba
static int test_null_channels(struct harness_t *harness_p)
{
    struct chan_t chan;
    char value;

    BTASSERT(chan_init(&chan,
                       chan_read_null,
                       chan_write_null,
                       chan_size_null) == 0);

    BTASSERT(chan_read(&chan, &value, 1) == -1);
    BTASSERT(chan_write(&chan, &value, 1) == 1);
    BTASSERT(chan_size(&chan) == 1);

    return (0);
}
Beispiel #3
0
static void lt_proxy_loop_write(void* arg)
{
    proxy_conn_t *proxy = (proxy_conn_t*)arg;
    //proxy_conn_t *other = proxy->other;
    proxy_server *srv = &g_srv;
    int ret;
    lthread_chan_t* chans[3];
    void* msgs[3];
    kstring_t *buf = NULL;
    lthread_sel_t* sel = lthread_sel_create();
    chans[0] = proxy->write_ch;
    chans[1] = proxy->die_ch;
    chans[2] = srv->die_ch;
    fprintf(stderr, "%s#%d started\n", __FUNCTION__, __LINE__);

    while(!proxy->is_die) {
        ret = chan_select(sel, chans, msgs, 0, 3, LTHREAD_FOREVER);
        switch(ret) {
        case 0:
            //recv channel ok
            buf = msgs[0];
            if(NULL == buf && chan_is_closed(chans[0])) {
                //channel closed
                ret = -10;
                fprintf(stderr, "%s#%d chan closed priv=%d\n", __FUNCTION__, __LINE__, proxy->is_priv);
                break;
            }
            assert(NULL != buf);

            //fprintf(stderr, "recv new writer\n");
            ret = net_conn_write(&proxy->conn.base, (uint8_t*)buf->s, buf->l, LTHREAD_FOREVER);
            if(ret <= 0) {
                fprintf(stderr, "write failed ret=%d priv=%d\n", ret, proxy->is_priv);
                ret = -11;
            }
            ks_free(buf);
            free(buf);
            buf = NULL;
            break;
        case 1:
            //proxy already die
            ret = -12;
            break;
        case 2:
            //server already die
            ret = -13;
            break;
        default:
            break;
        }

        //after switch
        if(ret < 0) {
            fprintf(stderr, "%s#%d error is_priv=%d ret=%d\n", __FUNCTION__, __LINE__, proxy->is_priv, ret);
            break;
        }
    }
    if(NULL != buf) {
        ks_free(buf);
        free(buf);
    }
    assert(0 == chan_size(chans[0]));
    if(!proxy->is_die) {
        proxy->is_die = 1;
        chan_close(proxy->die_ch);
    }
    net_conn_shutdown(&proxy->conn.base);
    lthread_sel_dispose(sel);
}