bug fix about epoll event cache machanism: socket may be closed by a previous epoll event's processing

This commit is contained in:
footer
2013-06-16 13:04:09 +08:00
parent c8b5c9ed89
commit e2c33c3ef6

View File

@@ -449,11 +449,12 @@ _read_one(struct mread_pool * self) {
if (ret == LISTENSOCKET) { if (ret == LISTENSOCKET) {
return ret; return ret;
} }
if (writeflag) { if (writeflag && ret->status != SOCKET_CLOSED) {
client_send(&ret->client, ret->fd); client_send(&ret->client, ret->fd);
try_close(self, ret); try_close(self, ret);
} }
if (readflag) if (readflag && ret->status != SOCKET_HALFCLOSE &&
ret->status != SOCKET_CLOSED)
return ret; return ret;
} }
} }
@@ -527,10 +528,10 @@ mread_poll(struct mread_pool * self , int timeout) {
return self->active; return self->active;
} }
} }
if (self->closed > 0 ) {
return _report_closed(self);
}
if (self->queue_head >= self->queue_len) { if (self->queue_head >= self->queue_len) {
if (self->closed > 0 ) {
return _report_closed(self);
}
if (_read_queue(self, timeout) == -1) { if (_read_queue(self, timeout) == -1) {
self->active = -1; self->active = -1;
return -1; return -1;
@@ -778,8 +779,7 @@ mread_closed(struct mread_pool * self) {
return 0; return 0;
} }
struct socket * s = &self->sockets[self->active]; struct socket * s = &self->sockets[self->active];
if ((s->status == SOCKET_CLOSED || if (s->status == SOCKET_CLOSED && s->node == NULL) {
s->status == SOCKET_HALFCLOSE) && s->node == NULL) {
mread_yield(self); mread_yield(self);
return 1; return 1;
} }