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; }
int fdev_del(struct fdev *ev) { // if (ev->index >= 0) // m_valid[ev->index] = 0; return fdev_disable(ev, EV_READ|EV_WRITE); }
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); }