static void
update_result(isc_nmsocket_t *sock, const isc_result_t result) {
- if (!sock->tlsstream.server) {
- LOCK(&sock->lock);
- sock->result = result;
- SIGNAL(&sock->cond);
- while (!atomic_load(&sock->active)) {
- WAIT(&sock->scond, &sock->lock);
+ if (!atomic_load(&sock->tlsstream.result_updated)) {
+ atomic_store(&sock->tlsstream.result_updated, true);
+ if (!sock->tlsstream.server) {
+ LOCK(&sock->lock);
+ sock->result = result;
+ SIGNAL(&sock->cond);
+ while (!atomic_load(&sock->active)) {
+ WAIT(&sock->scond, &sock->lock);
+ }
+ UNLOCK(&sock->lock);
+ } else {
+ LOCK(&sock->lock);
+ sock->result = result;
+ UNLOCK(&sock->lock);
}
- UNLOCK(&sock->lock);
- } else {
- LOCK(&sock->lock);
- sock->result = result;
- UNLOCK(&sock->lock);
}
}
isc_nmsocket_t *nsock = NULL, *tsock = NULL;
isc__netievent_tlsconnect_t *ievent = NULL;
isc_result_t result = ISC_R_DEFAULT;
+#if defined(NETMGR_TRACE) && defined(NETMGR_TRACE_VERBOSE)
+ fprintf(stderr, "TLS: isc_nm_tlsconnect(): in net thread: %s\n",
+ isc__nm_in_netthread() ? "yes" : "no");
+#endif /* NETMGR_TRACE */
REQUIRE(VALID_NM(mgr));
nsock->connect_cbarg = cbarg;
nsock->connect_timeout = timeout;
nsock->tlsstream.ctx = ctx;
+ nsock->tlsstream.connect_from_networker = isc__nm_in_netthread();
ievent = isc__nm_get_netievent_tlsconnect(mgr, nsock);
ievent->local = local->addr;
tlssock->tlsstream.tls = isc_tls_create(tlssock->tlsstream.ctx);
if (tlssock->tlsstream.tls == NULL) {
result = ISC_R_TLSERROR;
- update_result(tlssock, result);
goto error;
}
tlssock->tid = isc_nm_tid();
tlssock->tlsstream.state = TLS_INIT;
- (void)isc_nm_tcpconnect(worker->mgr, (isc_nmiface_t *)&ievent->local,
- (isc_nmiface_t *)&ievent->peer, tcp_connected,
- tlssock, tlssock->connect_timeout, 0);
+ result = isc_nm_tcpconnect(worker->mgr, (isc_nmiface_t *)&ievent->local,
+ (isc_nmiface_t *)&ievent->peer,
+ tcp_connected, tlssock,
+ tlssock->connect_timeout, 0);
+ if (tlssock->tlsstream.connect_from_networker) {
+ update_result(tlssock, result);
+ }
return;
error: