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; }
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); }
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); }