diff --git a/src/epoll-socket.c b/src/epoll-socket.c index 5a2e3ec..c56d9ec 100644 --- a/src/epoll-socket.c +++ b/src/epoll-socket.c @@ -29,7 +29,6 @@ typedef struct _ep_sock_private { poll_req_t* latest_poll_req; uint32_t user_events; uint32_t latest_poll_req_events; - uint32_t poll_req_count; uint32_t flags; uint8_t poll_status; } _ep_sock_private_t; @@ -50,6 +49,7 @@ static inline _ep_sock_private_t* _ep_sock_alloc(void) { } static inline void _ep_sock_free(_ep_sock_private_t* sock_private) { + assert(sock_private->poll_status == _POLL_IDLE); free(sock_private); } @@ -131,7 +131,8 @@ void _ep_sock_maybe_free(_ep_sock_private_t* sock_private) { * released yet. It'll be released later as ep_sock_unregister_poll_req() * calls this function. */ - if (_ep_sock_is_deleted(sock_private) && sock_private->poll_req_count == 0) + if (_ep_sock_is_deleted(sock_private) && + sock_private->poll_status == _POLL_IDLE) _ep_sock_free(sock_private); } @@ -153,7 +154,7 @@ void ep_sock_force_delete(ep_port_t* port_info, ep_sock_t* sock_info) { _ep_sock_private_t* sock_private = _ep_sock_private(sock_info); if (sock_private->latest_poll_req != NULL) poll_req_delete(sock_info, sock_private->latest_poll_req); - assert(sock_private->poll_req_count == 0); + sock_private->poll_status = _POLL_IDLE; ep_sock_delete(port_info, sock_info); } @@ -165,23 +166,6 @@ ep_sock_t* ep_sock_find(tree_t* tree, SOCKET socket) { return container_of(tree_node, ep_sock_t, tree_node); } -void ep_sock_register_poll_req(ep_sock_t* sock_info) { - _ep_sock_private_t* sock_private = _ep_sock_private(sock_info); - assert(!_ep_sock_is_deleted(sock_private)); - - sock_private->poll_req_count++; - assert(sock_private->poll_req_count == 1); -} - -void ep_sock_unregister_poll_req(ep_sock_t* sock_info) { - _ep_sock_private_t* sock_private = _ep_sock_private(sock_info); - - sock_private->poll_req_count--; - assert(sock_private->poll_req_count == 0); - - _ep_sock_maybe_free(sock_private); -} - int ep_sock_set_event(ep_port_t* port_info, ep_sock_t* sock_info, const struct epoll_event* ev) { @@ -286,6 +270,8 @@ int ep_sock_feed_event(ep_port_t* port_info, bool drop_socket; int ev_count = 0; + _clear_latest_poll_req(sock_private); + if (_ep_sock_is_deleted(sock_private)) { /* Ignore completion for overlapped poll operation if the socket has been * deleted. */ @@ -293,8 +279,6 @@ int ep_sock_feed_event(ep_port_t* port_info, return 0; } - _clear_latest_poll_req(sock_private); - poll_req_complete(poll_req, &epoll_events, &drop_socket); /* Filter events that the user didn't ask for. */ diff --git a/src/epoll-socket.h b/src/epoll-socket.h index baafd60..864fed1 100644 --- a/src/epoll-socket.h +++ b/src/epoll-socket.h @@ -35,7 +35,4 @@ EPOLL_INTERNAL int ep_sock_feed_event(ep_port_t* port_info, poll_req_t* poll_req, struct epoll_event* ev); -EPOLL_INTERNAL void ep_sock_register_poll_req(ep_sock_t* sock_info); -EPOLL_INTERNAL void ep_sock_unregister_poll_req(ep_sock_t* sock_info); - #endif /* EPOLL_SOCK_DATA_H_ */ diff --git a/src/poll-request.c b/src/poll-request.c index 3cd2869..6acc7d8 100644 --- a/src/poll-request.c +++ b/src/poll-request.c @@ -38,16 +38,12 @@ poll_req_t* poll_req_new(ep_sock_t* sock_info) { memset(poll_req, 0, sizeof *poll_req); poll_req->sock_info = sock_info; - ep_sock_register_poll_req(sock_info); - return poll_req; } void poll_req_delete(ep_sock_t* sock_info, poll_req_t* poll_req) { assert(poll_req != NULL); - ep_sock_unregister_poll_req(sock_info); - _poll_req_free(poll_req); }