Ejemplo n.º 1
0
static int peer_write_cb(struct peer *p)
{
	int rv;

	struct msg_t *msg = NULL,*next = NULL;

	thread_mutex_lock(p->sq_mutex);
	msg = BTPDQ_FIRST(&p->send_queue);
	//拼包,分批防止饥饿
	while(msg && p->sendbuf.off < MAX_SENDBUF){
		next = BTPDQ_NEXT(msg,msg_entry);
		BTPDQ_REMOVE(&p->send_queue,msg,msg_entry);

		iobuf_write(p->allocator,&p->sendbuf,msg->buf,msg->len);
		mfree(p->allocator,msg->buf);
		mfree(p->allocator,msg);
		msg = next;
	}

	if(p->sendbuf.off <= 0)
	{
		fdev_disable(&p->ioev,EV_WRITE);
		thread_mutex_unlock(p->sq_mutex);
		return 0;
	}

	thread_mutex_unlock(p->sq_mutex);
	rv = write(p->sd,p->sendbuf.buf,p->sendbuf.off);
	while((rv >= 0) || (rv < 0 && errno == EINTR))
	{
		if(rv > 0)
			iobuf_consumed(&p->sendbuf,rv);
		if(p->sendbuf.off <= 0)
			break;
		rv = write(p->sd,p->sendbuf.buf,p->sendbuf.off);
	}
	if(rv < 0 && errno != EAGAIN)
	{
		return -1;
	}

	thread_mutex_lock(p->sq_mutex);
	if(BTPDQ_EMPTY(&p->send_queue) && p->sendbuf.off <= 0)
	{
		fdev_disable(&p->ioev,EV_WRITE);
	}
	thread_mutex_unlock(p->sq_mutex);
	return 0;
}
Ejemplo n.º 2
0
Archivo: epoll.c Proyecto: zhoubug/znet
int
fdev_del(struct fdev *ev)
{
//    if (ev->index >= 0)
 //       m_valid[ev->index] = 0;
    return fdev_disable(ev, EV_READ|EV_WRITE);
}
Ejemplo n.º 3
0
int
fdev_del(struct fdev *ev)
{
    if (ev->rdidx >= 0)
        m_valid[ev->rdidx] = 0;
    if (ev->wridx >= 0)
        m_valid[ev->wridx] = 0;
    return fdev_disable(ev, EV_READ|EV_WRITE);
}