netievent_tcpdnssend,
netievent_tcpdnsclose,
+ netievent_tcpdnsstop,
netievent_closecb,
netievent_shutdown,
typedef isc__netievent__socket_t isc__netievent_pauseread_t;
typedef isc__netievent__socket_t isc__netievent_closecb_t;
typedef isc__netievent__socket_t isc__netievent_tcpdnsclose_t;
+typedef isc__netievent__socket_t isc__netievent_tcpdnsstop_t;
typedef struct isc__netievent__socket_req {
isc__netievent_type type;
void
isc__nm_async_tcpdnsclose(isc__networker_t *worker, isc__netievent_t *ev0);
-
void
isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0);
+void
+isc__nm_async_tcpdnsstop(isc__networker_t *worker, isc__netievent_t *ev0);
#define isc__nm_uverr2result(x) \
isc___nm_uverr2result(x, true, __FILE__, __LINE__)
case netievent_tcpdnsclose:
isc__nm_async_tcpdnsclose(worker, ievent);
break;
+ case netievent_tcpdnsstop:
+ isc__nm_async_tcpdnsstop(worker, ievent);
+ break;
case netievent_closecb:
isc__nm_async_closecb(worker, ievent);
void
isc__nm_tcp_stoplistening(isc_nmsocket_t *sock) {
- isc__netievent_tcpstop_t *ievent = NULL;
-
REQUIRE(VALID_NMSOCK(sock));
- REQUIRE(!isc__nm_in_netthread());
+ REQUIRE(sock->type == isc_nm_tcplistener);
- ievent = isc__nm_get_ievent(sock->mgr, netievent_tcpstop);
+ isc__netievent_tcpstop_t *ievent =
+ isc__nm_get_ievent(sock->mgr, netievent_tcpstop);
isc__nmsocket_attach(sock, &ievent->sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
}
void
-isc__nm_tcpdns_stoplistening(isc_nmsocket_t *sock) {
+isc__nm_async_tcpdnsstop(isc__networker_t *worker, isc__netievent_t *ev0) {
+ isc__netievent_tcpstop_t *ievent = (isc__netievent_tcpdnsstop_t *)ev0;
+ isc_nmsocket_t *sock = ievent->sock;
+
+ UNUSED(worker);
+
+ REQUIRE(isc__nm_in_netthread());
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_tcpdnslistener);
+ REQUIRE(sock->tid == isc_nm_tid());
atomic_store(&sock->listening, false);
atomic_store(&sock->closed, true);
+
isc__nmsocket_clearcb(sock);
if (sock->outer != NULL) {
isc__nm_tcp_stoplistening(sock->outer);
isc__nmsocket_detach(&sock->outer);
}
+
+ isc__nmsocket_detach(&sock);
+}
+
+void
+isc__nm_tcpdns_stoplistening(isc_nmsocket_t *sock) {
+ REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->type == isc_nm_tcpdnslistener);
+
+ isc__netievent_tcpdnsstop_t *ievent =
+ isc__nm_get_ievent(sock->mgr, netievent_tcpdnsstop);
+ isc__nmsocket_attach(sock, &ievent->sock);
+ isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
+ (isc__netievent_t *)ievent);
}
void