* startup and shutdown of the server, as well as all exclusive
* tasks.
*/
- CHECKFATAL(isc_task_create(named_g_taskmgr, 0, &server->task),
+ CHECKFATAL(isc_task_create_bound(named_g_taskmgr, 0, &server->task, 0),
"creating server task");
isc_task_setname(server->task, "server", server);
isc_taskmgr_setexcltask(named_g_taskmgr, server->task);
sock->nchildren = sock->outer->nchildren;
sock->result = ISC_R_UNSET;
- sock->tid = isc_random_uniform(sock->nchildren);
+ sock->tid = 0;
sock->fd = (uv_os_sock_t)-1;
atomic_store(&sock->listening, true);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
} else {
+ REQUIRE(isc_nm_tid() == sock->tid);
isc__netievent_httpstop_t ievent = { .sock = sock };
isc__nm_async_httpstop(NULL, (isc__netievent_t *)&ievent);
}
isc__nm_acquire_interlocked_force(mgr);
+ if (isc__nm_in_netthread()) {
+ REQUIRE(isc_nm_tid() == 0);
+ }
+
for (int i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
if (i == isc_nm_tid()) {
}
if (isc__nm_in_netthread()) {
+ atomic_fetch_add(&mgr->workers_paused, 1);
isc_barrier_wait(&mgr->pausing);
- drain_priority_queue(&mgr->workers[isc_nm_tid()]);
}
LOCK(&mgr->lock);
REQUIRE(VALID_NM(mgr));
REQUIRE(atomic_load(&mgr->paused));
+ if (isc__nm_in_netthread()) {
+ REQUIRE(isc_nm_tid() == 0);
+ drain_priority_queue(&mgr->workers[isc_nm_tid()]);
+ }
+
for (int i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
if (i == isc_nm_tid()) {
(isc__netievent_t *)ievent);
}
+static void
+enqueue_stoplistening(isc_nmsocket_t *sock) {
+ isc__netievent_tcpstop_t *ievent =
+ isc__nm_get_netievent_tcpstop(sock->mgr, sock);
+ isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
+ (isc__netievent_t *)ievent);
+}
+
isc_result_t
isc_nm_listentcp(isc_nm_t *mgr, isc_nmiface_t *iface,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
sock->backlog = backlog;
sock->pquota = quota;
- if (isc__nm_in_netthread()) {
- sock->tid = isc_nm_tid();
- } else {
- sock->tid = isc_random_uniform(sock->nchildren);
- }
+ sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB && !defined(WIN32)
*sockp = sock;
} else {
atomic_store(&sock->active, false);
- isc_nm_stoplistening(sock);
+ enqueue_stoplistening(sock);
isc_nmsocket_close(&sock);
}
}
}
-static void
-enqueue_stoplistening(isc_nmsocket_t *sock) {
- isc__netievent_tcpstop_t *ievent =
- isc__nm_get_netievent_tcpstop(sock->mgr, sock);
- isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
- (isc__netievent_t *)ievent);
-}
-
void
isc__nm_tcp_stoplistening(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
if (!isc__nm_in_netthread()) {
enqueue_stoplistening(sock);
- } else if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
} else {
stop_tcp_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
}
}
return;
}
- if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
- } else {
- stop_tcp_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
- }
+ stop_tcp_parent(sock);
}
void
static void
stop_tcp_parent(isc_nmsocket_t *sock) {
isc_nmsocket_t *csock = NULL;
+
REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(sock->type == isc_nm_tcplistener);
isc_barrier_init(&sock->stoplistening, sock->nchildren);
return (sock);
}
+static void
+enqueue_stoplistening(isc_nmsocket_t *sock) {
+ isc__netievent_tcpdnsstop_t *ievent =
+ isc__nm_get_netievent_tcpdnsstop(sock->mgr, sock);
+ isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
+ (isc__netievent_t *)ievent);
+}
+
static void
start_tcpdns_child(isc_nm_t *mgr, isc_nmiface_t *iface, isc_nmsocket_t *sock,
uv_os_sock_t fd, int tid) {
sock->backlog = backlog;
sock->pquota = quota;
- if (isc__nm_in_netthread()) {
- sock->tid = isc_nm_tid();
- } else {
- sock->tid = isc_random_uniform(sock->nchildren);
- }
+ sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB && !defined(WIN32)
*sockp = sock;
} else {
atomic_store(&sock->active, false);
- isc_nm_stoplistening(sock);
+ enqueue_stoplistening(sock);
isc_nmsocket_close(&sock);
}
}
}
-static void
-enqueue_stoplistening(isc_nmsocket_t *sock) {
- isc__netievent_tcpdnsstop_t *ievent =
- isc__nm_get_netievent_tcpdnsstop(sock->mgr, sock);
- isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
- (isc__netievent_t *)ievent);
-}
-
void
isc__nm_tcpdns_stoplistening(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
if (!isc__nm_in_netthread()) {
enqueue_stoplistening(sock);
- } else if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
} else {
stop_tcpdns_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
}
}
return;
}
- /*
- * If network manager is paused, re-enqueue the event for later.
- */
- if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
- } else {
- stop_tcpdns_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
- }
+ stop_tcpdns_parent(sock);
}
void
isc_nmsocket_t *csock = NULL;
REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(sock->type == isc_nm_tcpdnslistener);
isc_barrier_init(&sock->stoplistening, sock->nchildren);
(isc__netievent_t *)ievent);
}
+static void
+enqueue_stoplistening(isc_nmsocket_t *sock) {
+ isc__netievent_tlsdnsstop_t *ievent =
+ isc__nm_get_netievent_tlsdnsstop(sock->mgr, sock);
+ isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
+ (isc__netievent_t *)ievent);
+}
+
isc_result_t
isc_nm_listentlsdns(isc_nm_t *mgr, isc_nmiface_t *iface,
isc_nm_recv_cb_t recv_cb, void *recv_cbarg,
sock->backlog = backlog;
sock->pquota = quota;
- if (isc__nm_in_netthread()) {
- sock->tid = isc_nm_tid();
- } else {
- sock->tid = isc_random_uniform(sock->nchildren);
- }
-
sock->tls.ctx = sslctx;
+
+ sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB && !defined(WIN32)
*sockp = sock;
} else {
atomic_store(&sock->active, false);
- isc_nm_stoplistening(sock);
+ enqueue_stoplistening(sock);
isc_nmsocket_close(&sock);
}
}
}
-static void
-enqueue_stoplistening(isc_nmsocket_t *sock) {
- isc__netievent_tlsdnsstop_t *ievent =
- isc__nm_get_netievent_tlsdnsstop(sock->mgr, sock);
- isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
- (isc__netievent_t *)ievent);
-}
-
void
isc__nm_tlsdns_stoplistening(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
if (!isc__nm_in_netthread()) {
enqueue_stoplistening(sock);
- } else if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
} else {
stop_tlsdns_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
}
}
return;
}
- /*
- * If network manager is paused, re-enqueue the event for later.
- */
- if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
- } else {
- stop_tlsdns_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
- }
+ stop_tlsdns_parent(sock);
}
void
isc_nmsocket_t *csock = NULL;
REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(sock->type == isc_nm_tlsdnslistener);
isc_barrier_init(&sock->stoplistening, sock->nchildren);
(isc__netievent_t *)ievent);
}
+static void
+enqueue_stoplistening(isc_nmsocket_t *sock) {
+ isc__netievent_udpstop_t *ievent =
+ isc__nm_get_netievent_udpstop(sock->mgr, sock);
+ isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
+ (isc__netievent_t *)ievent);
+}
+
isc_result_t
isc_nm_listenudp(isc_nm_t *mgr, isc_nmiface_t *iface, isc_nm_recv_cb_t cb,
void *cbarg, size_t extrahandlesize, isc_nmsocket_t **sockp) {
sock->recv_cbarg = cbarg;
sock->extrahandlesize = extrahandlesize;
sock->result = ISC_R_UNSET;
- if (isc__nm_in_netthread()) {
- sock->tid = isc_nm_tid();
- } else {
- sock->tid = isc_random_uniform(sock->nchildren);
- }
+
+ sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB && !defined(WIN32)
*sockp = sock;
} else {
atomic_store(&sock->active, false);
- isc_nm_stoplistening(sock);
+ enqueue_stoplistening(sock);
isc_nmsocket_close(&sock);
}
isc_barrier_wait(&sock->parent->startlistening);
}
-static void
-enqueue_stoplistening(isc_nmsocket_t *sock) {
- isc__netievent_udpstop_t *ievent =
- isc__nm_get_netievent_udpstop(sock->mgr, sock);
- isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
- (isc__netievent_t *)ievent);
-}
-
void
isc__nm_udp_stoplistening(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
if (!isc__nm_in_netthread()) {
enqueue_stoplistening(sock);
- } else if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
} else {
stop_udp_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
}
}
return;
}
- /*
- * If network manager is paused, re-enqueue the event for later.
- */
- if (!isc__nm_acquire_interlocked(sock->mgr)) {
- enqueue_stoplistening(sock);
- } else {
- stop_udp_parent(sock);
- isc__nm_drop_interlocked(sock->mgr);
- }
+ stop_udp_parent(sock);
}
/*
isc_nmsocket_t *csock = NULL;
REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(sock->type == isc_nm_udplistener);
isc_barrier_init(&sock->stoplistening, sock->nchildren);
isc_taskmgr_setexcltask(isc_taskmgr_t *mgr, isc_task_t *task) {
REQUIRE(VALID_MANAGER(mgr));
REQUIRE(VALID_TASK(task));
+ REQUIRE(task->threadid == 0);
+
LOCK(&mgr->excl_lock);
if (mgr->excl != NULL) {
isc_task_detach(&mgr->excl);
isc_managers_create(test_mctx, workers, 0, 0, &netmgr, &taskmgr,
&timermgr, &socketmgr);
- CHECK(isc_task_create(taskmgr, 0, &maintask));
+ CHECK(isc_task_create_bound(taskmgr, 0, &maintask, 0));
isc_taskmgr_setexcltask(taskmgr, maintask);
return (ISC_R_SUCCESS);
tasks[i] = NULL;
- result = isc_task_create(taskmgr, 0, &tasks[i]);
- assert_int_equal(result, ISC_R_SUCCESS);
-
- /* task chosen from the middle of the range */
if (i == 6) {
+ /* task chosen from the middle of the range */
+ result = isc_task_create_bound(taskmgr, 0, &tasks[i],
+ 0);
+ assert_int_equal(result, ISC_R_SUCCESS);
+
isc_taskmgr_setexcltask(taskmgr, tasks[6]);
+ } else {
+ result = isc_task_create(taskmgr, 0, &tasks[i]);
+ assert_int_equal(result, ISC_R_SUCCESS);
}
v = isc_mem_get(test_mctx, sizeof *v);
isc_managers_create(mctx, ncpus, 0, 0, &netmgr, &taskmgr, &timermgr,
&socketmgr);
- CHECK(isc_task_create(taskmgr, 0, &maintask));
+ CHECK(isc_task_create_bound(taskmgr, 0, &maintask, 0));
isc_taskmgr_setexcltask(taskmgr, maintask);
CHECK(isc_task_onshutdown(maintask, shutdown_managers, NULL));