#include "netmgr-int.h"
#include "uv-compat.h"
+#include <execinfo.h>
+
+#define BACKTRACE() do { void *arr[4]; backtrace_symbols_fd(arr, backtrace(arr, 4), 2); fprintf(stderr, "\n"); } while(0)
+
/*%
* How many isc_nmhandles and isc_nm_uvreqs will we be
fprintf(stderr, "attach sock %p (%s) to %lu\n", sock, isc__nm_socket_type(sock->type), sock->references+1);
isc_refcount_increment0(&sock->references);
}
+ BACKTRACE();
*target = sock;
}
if (sock->outerhandle != NULL) {
isc_nmhandle_unref(sock->outerhandle);
fprintf(stderr, "sock %p outerhandle %p, clearing?\n", sock, sock->outerhandle);
+ BACKTRACE();
sock->outerhandle = NULL;
}
fprintf(stderr, "detach sock %p (%s) to %lu\n", sock, isc__nm_socket_type(sock->type), sock->references-1);
rsock = sock;
}
+ BACKTRACE();
if (isc_refcount_decrement(&rsock->references) == 1) {
isc__nmsocket_prep_destroy(rsock);
family = iface->addr.type.sa.sa_family;
fprintf(stderr, "init sock %p (%s)\n", sock, isc__nm_socket_type(type));
+ BACKTRACE();
*sock = (isc_nmsocket_t){ .type = type,
.iface = iface,
REQUIRE(VALID_NMHANDLE(handle));
fprintf(stderr, "ref %p (%p %s) to %lu\n", handle, handle->sock, isc__nm_socket_type(handle->sock->type), handle->references+1);
+ BACKTRACE();
isc_refcount_increment(&handle->references);
}
REQUIRE(VALID_NMHANDLE(handle));
fprintf(stderr, "unref %p (%p %s) to %lu\n", handle, handle->sock, isc__nm_socket_type(handle->sock->type), handle->references-1);
+ BACKTRACE();
if (isc_refcount_decrement(&handle->references) > 1) {
return;
}
sock = handle->sock;
handle->sock = NULL;
fprintf(stderr, "handle %p sock %p set to NULL\n", handle, sock);
+ BACKTRACE();
if (handle->doreset != NULL) {
handle->doreset(handle->opaque);
timer_close_cb(uv_handle_t *handle) {
isc_nmsocket_t *sock = (isc_nmsocket_t *)uv_handle_get_data(handle);
INSIST(VALID_NMSOCK(sock));
-fprintf(stderr, "timer close cb, sock %p\n", sock);
+ fprintf(stderr, "timer close cb, sock %p\n", sock);
+ atomic_store(&sock->closed, true);
+ tcpdns_close_direct(sock);
}
static void
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid == isc_nm_tid());
- tcpdns_close_direct(sock);
+ if (sock->self != NULL) {
+ isc__nmsocket_detach(&sock->self);
+ };
}
/*
dnssock->extrahandlesize = dnslistensock->extrahandlesize;
isc__nmsocket_attach(dnslistensock, &dnssock->listener);
+ isc__nmsocket_attach(dnssock, &dnssock->self);
+
dnssock->outerhandle = handle;
isc_nmhandle_ref(dnssock->outerhandle);
dnssock->timer_initialized = true;
uv_timer_start(&dnssock->timer, dnstcp_readtimeout,
dnssock->read_timeout, 0);
-
+ fprintf(stderr, "dnssock->refs %lu\n", dnssock->references);
isc_nmhandle_ref(handle);
result = isc_nm_read(handle, dnslisten_readcb, dnssock);
if (result != ISC_R_SUCCESS) {
isc_nmhandle_unref(handle);
}
+ isc__nmsocket_detach(&dnssock);
}
/*
dnssock->buf_len);
}
- /*
- * dnssock is now attached to dnshandle
- */
- isc__nmsocket_detach(&dnssock);
-
*handlep = dnshandle;
return (ISC_R_SUCCESS);
}
fprintf(stderr, "dnslisten_readcb %p (reg %p), sock %p (%s)\n", handle, handle->sock, region, handle->sock ? isc__nm_socket_type(handle->sock->type) : "nil");
if (region == NULL) {
/* Connection closed */
- isc__nm_tcpdns_close(dnssock);
+ isc_nmhandle_unref(handle);
+ if (dnssock->self != NULL) {
+ isc__nmsocket_detach(&dnssock->self);
+ };
return;
}
isc_nmhandle_unref(handle);
} else if (sock->outerhandle != NULL) {
isc_nm_resumeread(sock->outerhandle->sock);
+
}
return;
isc_mem_attach(sock->mgr->mctx, &t->mctx);
t->orighandle = handle;
isc_nmhandle_ref(t->orighandle);
+ isc_nmhandle_ref(t->handle);
t->region = (isc_region_t){ .base = isc_mem_get(t->mctx,
region->length + 2),
tcpdns_close_direct(isc_nmsocket_t *sock) {
REQUIRE(sock->tid == isc_nm_tid());
-fprintf(stderr, "close sock %p (tcpdns)\n", sock);
+fprintf(stderr, "close sock %p (tcpdns) %lu\n", sock, sock->references);
/* We don't need atomics here, it's all in single network thread */
if (sock->timer_initialized) {
/*
fprintf(stderr, "closing timer\n");
uv_close((uv_handle_t *)&sock->timer, timer_close_cb);
fprintf(stderr, "...done\n");
+ } else if (sock->self != NULL) {
+ isc__nmsocket_detach(&sock->self);
} else {
/*
* At this point we're certain that there are no external
fprintf(stderr, "clearing outerhandle\n");
sock->outerhandle->sock->rcb.recv = NULL;
isc_nmhandle_unref(sock->outerhandle);
- sock->outerhandle = NULL;
+ sock->outerhandle = NULL;
}
if (sock->listener != NULL) {
fprintf(stderr, "clearing listener\n");
isc__nmsocket_detach(&sock->listener);
}
atomic_store(&sock->closed, true);
-fprintf(stderr, "prep socket destruction\n");
isc__nmsocket_prep_destroy(sock);
+fprintf(stderr, "prep socket destruction\n");
}
fprintf(stderr, "closed\n");
}