mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
Don't attach to socket in the done event anymore, and GC the done_event_destroy() function.
This commit is contained in:
@@ -193,7 +193,6 @@ static void send_recvdone_event(isc_socket_t *, isc_task_t **, rwintev_t **,
|
|||||||
isc_socketevent_t **, isc_result_t);
|
isc_socketevent_t **, isc_result_t);
|
||||||
static void send_senddone_event(isc_socket_t *, isc_task_t **, rwintev_t **,
|
static void send_senddone_event(isc_socket_t *, isc_task_t **, rwintev_t **,
|
||||||
isc_socketevent_t **, isc_result_t);
|
isc_socketevent_t **, isc_result_t);
|
||||||
static void done_event_destroy(isc_event_t *);
|
|
||||||
static void free_socket(isc_socket_t **);
|
static void free_socket(isc_socket_t **);
|
||||||
static isc_result_t allocate_socket(isc_socketmgr_t *, isc_sockettype_t,
|
static isc_result_t allocate_socket(isc_socketmgr_t *, isc_sockettype_t,
|
||||||
isc_socket_t **);
|
isc_socket_t **);
|
||||||
@@ -321,34 +320,6 @@ socket_dump(isc_socket_t *sock)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle freeing a done event when needed.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
done_event_destroy(isc_event_t *ev)
|
|
||||||
{
|
|
||||||
isc_socket_t *sock = ev->sender;
|
|
||||||
isc_boolean_t kill_socket = ISC_FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* detach from the socket. We would have already detached from the
|
|
||||||
* task when we actually queue this event up.
|
|
||||||
*/
|
|
||||||
LOCK(&sock->lock);
|
|
||||||
|
|
||||||
REQUIRE(sock->references > 0);
|
|
||||||
sock->references--;
|
|
||||||
XTRACE(TRACE_MANAGER, ("done_event_destroy: sock %p, ref cnt == %d\n",
|
|
||||||
sock, sock->references));
|
|
||||||
|
|
||||||
if (sock->references == 0)
|
|
||||||
kill_socket = ISC_TRUE;
|
|
||||||
UNLOCK(&sock->lock);
|
|
||||||
|
|
||||||
if (kill_socket)
|
|
||||||
destroy(&sock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kill.
|
* Kill.
|
||||||
*
|
*
|
||||||
@@ -787,7 +758,6 @@ send_ncdone_event(ncintev_t **iev,
|
|||||||
REQUIRE(*dev != NULL);
|
REQUIRE(*dev != NULL);
|
||||||
|
|
||||||
(*dev)->result = resultcode;
|
(*dev)->result = resultcode;
|
||||||
(*dev)->common.destroy = done_event_destroy;
|
|
||||||
ISC_TASK_SEND((*iev)->task, (isc_event_t **)dev);
|
ISC_TASK_SEND((*iev)->task, (isc_event_t **)dev);
|
||||||
isc_task_detach(&(*iev)->task);
|
isc_task_detach(&(*iev)->task);
|
||||||
(*iev)->done_ev = NULL;
|
(*iev)->done_ev = NULL;
|
||||||
@@ -922,6 +892,7 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
|
|||||||
if (manager->maxfd < fd)
|
if (manager->maxfd < fd)
|
||||||
manager->maxfd = fd;
|
manager->maxfd = fd;
|
||||||
manager->nsockets++;
|
manager->nsockets++;
|
||||||
|
XTRACE(TRACE_MANAGER, ("nsockets == %d\n", manager->nsockets));
|
||||||
UNLOCK(&manager->lock);
|
UNLOCK(&manager->lock);
|
||||||
|
|
||||||
XTRACE(TRACE_LISTEN, ("internal_accept: newsock %p, fd %d\n",
|
XTRACE(TRACE_LISTEN, ("internal_accept: newsock %p, fd %d\n",
|
||||||
@@ -1730,13 +1701,6 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
|
|||||||
iev = NULL; /* just in case */
|
iev = NULL; /* just in case */
|
||||||
}
|
}
|
||||||
|
|
||||||
sock->references++; /* attach to socket in cheap way */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remember that we need to detach on event free
|
|
||||||
*/
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UDP sockets are always partial read
|
* UDP sockets are always partial read
|
||||||
*/
|
*/
|
||||||
@@ -1933,13 +1897,6 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
|||||||
iev = NULL; /* just in case */
|
iev = NULL; /* just in case */
|
||||||
}
|
}
|
||||||
|
|
||||||
sock->references++; /* attach to socket in cheap way */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remember that we need to detach on event free
|
|
||||||
*/
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
|
|
||||||
dev->region = *region;
|
dev->region = *region;
|
||||||
dev->n = 0;
|
dev->n = 0;
|
||||||
dev->result = ISC_R_SUCCESS;
|
dev->result = ISC_R_SUCCESS;
|
||||||
@@ -2219,7 +2176,6 @@ isc_socket_accept(isc_socket_t *sock,
|
|||||||
* Attach to socket and to task
|
* Attach to socket and to task
|
||||||
*/
|
*/
|
||||||
isc_task_attach(task, &ntask);
|
isc_task_attach(task, &ntask);
|
||||||
sock->references++;
|
|
||||||
nsock->references++;
|
nsock->references++;
|
||||||
|
|
||||||
sock->listener = ISC_TRUE;
|
sock->listener = ISC_TRUE;
|
||||||
@@ -2227,7 +2183,6 @@ isc_socket_accept(isc_socket_t *sock,
|
|||||||
iev->task = ntask;
|
iev->task = ntask;
|
||||||
iev->done_ev = dev;
|
iev->done_ev = dev;
|
||||||
iev->canceled = ISC_FALSE;
|
iev->canceled = ISC_FALSE;
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
dev->newsocket = nsock;
|
dev->newsocket = nsock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2302,6 +2257,15 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen,
|
|||||||
if (SOFT_ERROR(errno) || errno == EINPROGRESS)
|
if (SOFT_ERROR(errno) || errno == EINPROGRESS)
|
||||||
goto queue;
|
goto queue;
|
||||||
|
|
||||||
|
switch (errno) {
|
||||||
|
case ECONNREFUSED:
|
||||||
|
dev->result = ISC_R_CONNREFUSED;
|
||||||
|
goto err_exit;
|
||||||
|
case ENETUNREACH:
|
||||||
|
dev->result = ISC_R_NETUNREACH;
|
||||||
|
goto err_exit;
|
||||||
|
}
|
||||||
|
|
||||||
sock->connected = ISC_FALSE;
|
sock->connected = ISC_FALSE;
|
||||||
|
|
||||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
@@ -2309,13 +2273,14 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen,
|
|||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
err_exit:
|
||||||
* attach to socket
|
sock->connected = ISC_FALSE;
|
||||||
*/
|
ISC_TASK_SEND(task, (isc_event_t **)&dev);
|
||||||
sock->references++;
|
UNLOCK(&sock->lock);
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If connect completed, fire off the done event
|
* If connect completed, fire off the done event
|
||||||
@@ -2772,9 +2737,6 @@ isc_socket_recvmark(isc_socket_t *sock,
|
|||||||
if (EMPTY(sock->recv_list)) {
|
if (EMPTY(sock->recv_list)) {
|
||||||
dev->result = sock->recv_result;
|
dev->result = sock->recv_result;
|
||||||
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
sock->references++;
|
|
||||||
|
|
||||||
ISC_TASK_SEND(task, (isc_event_t **)&dev);
|
ISC_TASK_SEND(task, (isc_event_t **)&dev);
|
||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
@@ -2802,8 +2764,6 @@ isc_socket_recvmark(isc_socket_t *sock,
|
|||||||
ISC_LINK_INIT(iev, link);
|
ISC_LINK_INIT(iev, link);
|
||||||
iev->posted = ISC_FALSE;
|
iev->posted = ISC_FALSE;
|
||||||
|
|
||||||
sock->references++;
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
dev->result = ISC_R_SUCCESS;
|
dev->result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
isc_task_attach(task, &ntask);
|
isc_task_attach(task, &ntask);
|
||||||
@@ -2850,9 +2810,6 @@ isc_socket_sendmark(isc_socket_t *sock,
|
|||||||
if (EMPTY(sock->send_list)) {
|
if (EMPTY(sock->send_list)) {
|
||||||
dev->result = sock->send_result;
|
dev->result = sock->send_result;
|
||||||
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
sock->references++;
|
|
||||||
|
|
||||||
ISC_TASK_SEND(task, (isc_event_t **)&dev);
|
ISC_TASK_SEND(task, (isc_event_t **)&dev);
|
||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
@@ -2880,8 +2837,6 @@ isc_socket_sendmark(isc_socket_t *sock,
|
|||||||
ISC_LINK_INIT(iev, link);
|
ISC_LINK_INIT(iev, link);
|
||||||
iev->posted = ISC_FALSE;
|
iev->posted = ISC_FALSE;
|
||||||
|
|
||||||
sock->references++;
|
|
||||||
dev->common.destroy = done_event_destroy;
|
|
||||||
dev->result = ISC_R_SUCCESS;
|
dev->result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
isc_task_attach(task, &ntask);
|
isc_task_attach(task, &ntask);
|
||||||
|
Reference in New Issue
Block a user