mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Run isc__nm_http_stoplistening() synchronously in netmgr
When isc__nm_http_stoplistening() is run from inside the netmgr, we need to make sure it's run synchronously. This commit is just a band-aid though, as the desired behvaior for isc_nm_stoplistening() is not always the same: 1. When run from outside user of the interface, the call must be synchronous, e.g. the calling code expects the call to really stop listening on the interfaces. 2. But if there's a call from listen<proto> when listening fails, that needs to be scheduled to run asynchronously, because isc_nm_listen<proto> is being run in a paused (interlocked) netmgr thread and we could get stuck. The proper solution would be to make isc_nm_stoplistening() behave like uv_close(), i.e., to have a proper callback.
This commit is contained in:
@@ -2239,8 +2239,6 @@ isc_nm_http_endpoint(isc_nmsocket_t *sock, const char *uri, isc_nm_recv_cb_t cb,
|
||||
|
||||
void
|
||||
isc__nm_http_stoplistening(isc_nmsocket_t *sock) {
|
||||
isc__netievent_httpstop_t *ievent = NULL;
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->type == isc_nm_httplistener);
|
||||
|
||||
@@ -2250,9 +2248,15 @@ isc__nm_http_stoplistening(isc_nmsocket_t *sock) {
|
||||
ISC_UNREACHABLE();
|
||||
}
|
||||
|
||||
ievent = isc__nm_get_netievent_httpstop(sock->mgr, sock);
|
||||
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
|
||||
(isc__netievent_t *)ievent);
|
||||
if (!isc__nm_in_netthread()) {
|
||||
isc__netievent_httpstop_t *ievent =
|
||||
isc__nm_get_netievent_httpstop(sock->mgr, sock);
|
||||
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
|
||||
(isc__netievent_t *)ievent);
|
||||
} else {
|
||||
isc__netievent_httpstop_t ievent = { .sock = sock };
|
||||
isc__nm_async_httpstop(NULL, (isc__netievent_t *)&ievent);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2294,7 +2298,6 @@ isc__nm_async_httpstop(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||||
UNUSED(worker);
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
|
||||
atomic_store(&sock->listening, false);
|
||||
atomic_store(&sock->closing, false);
|
||||
|
Reference in New Issue
Block a user