isc_barrier_t barrier;
bool barrier_initialised;
+ atomic_bool manual_read_timer;
#ifdef NETMGR_TRACE
void *backtrace[TRACE_SIZE];
int backtrace_size;
* Set the read timeout for the TCP socket associated with 'handle'.
*/
+void
+isc__nmhandle_tcp_set_manual_timer(isc_nmhandle_t *handle, const bool manual);
+
void
isc__nm_async_tcpconnect(isc__networker_t *worker, isc__netievent_t *ev0);
void
void
isc__nmsocket_log_tls_session_reuse(isc_nmsocket_t *sock, isc_tls_t *tls);
+
+void
+isc__nmhandle_set_manual_timer(isc_nmhandle_t *handle, const bool manual);
+/*
+ * Set manual read timer control mode - so that it will not get reset
+ * automatically on read nor get started when read is initiated.
+ */
atomic_init(&sock->keepalive, false);
atomic_init(&sock->connected, false);
atomic_init(&sock->timedout, false);
+ atomic_init(&sock->manual_read_timer, false);
atomic_init(&sock->active_child_connections, 0);
client_sabuf, local_sabuf);
}
+void
+isc__nmhandle_set_manual_timer(isc_nmhandle_t *handle, const bool manual) {
+ REQUIRE(VALID_NMHANDLE(handle));
+ REQUIRE(VALID_NMSOCK(handle->sock));
+
+ isc_nmsocket_t *sock = handle->sock;
+
+ switch (sock->type) {
+ case isc_nm_tcpsocket:
+ isc__nmhandle_tcp_set_manual_timer(handle, manual);
+ return;
+ default:
+ break;
+ };
+
+ UNREACHABLE();
+}
+
#ifdef NETMGR_TRACE
/*
* Dump all active sockets in netmgr. We output to stderr
return;
}
- isc__nmsocket_timer_start(sock);
+ if (!atomic_load(&sock->manual_read_timer)) {
+ isc__nmsocket_timer_start(sock);
+ }
}
void
REQUIRE(sock->tid == isc_nm_tid());
UNUSED(worker);
- isc__nmsocket_timer_stop(sock);
+ if (!atomic_load(&sock->manual_read_timer)) {
+ isc__nmsocket_timer_stop(sock);
+ }
isc__nm_stop_reading(sock);
}
}
}
- /* The timer will be updated */
- isc__nmsocket_timer_restart(sock);
+ if (!atomic_load(&sock->manual_read_timer)) {
+ /* The timer will be updated */
+ isc__nmsocket_timer_restart(sock);
+ }
}
free:
INSIST(nactive >= 0);
return nactive;
}
+
+void
+isc__nmhandle_tcp_set_manual_timer(isc_nmhandle_t *handle, const bool manual) {
+ isc_nmsocket_t *sock;
+
+ REQUIRE(VALID_NMHANDLE(handle));
+ sock = handle->sock;
+ REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->type == isc_nm_tcpsocket);
+
+ atomic_store(&sock->manual_read_timer, manual);
+}