* the socket.
*/
isc_nmsocket_t *sock;
- size_t ah_pos; /* Position in the socket's 'active handles' array */
isc_sockaddr_t peer;
isc_sockaddr_t local;
isc_result_t result;
/*%
- * List of active handles.
- * ah - current position in 'ah_frees'; this represents the
- * current number of active handles;
- * ah_size - size of the 'ah_frees' and 'ah_handles' arrays
- * ah_handles - array pointers to active handles
- *
- * Adding a handle
- * - if ah == ah_size, reallocate
- * - x = ah_frees[ah]
- * - ah_frees[ah++] = 0;
- * - ah_handles[x] = handle
- * - x must be stored with the handle!
- * Removing a handle:
- * - ah_frees[--ah] = x
- * - ah_handles[x] = NULL;
- *
- * XXX: for now this is locked with socket->lock, but we
- * might want to change it to something lockless in the
- * future.
+ * Current number of active handles.
*/
atomic_int_fast32_t ah;
- size_t ah_size;
- size_t *ah_frees;
- isc_nmhandle_t **ah_handles;
/*% Buffer for TCPDNS processing */
size_t buf_size;
isc_astack_destroy(sock->inactivereqs);
sock->magic = 0;
- isc_mem_free(sock->mgr->mctx, sock->ah_frees);
- isc_mem_free(sock->mgr->mctx, sock->ah_handles);
isc_condition_destroy(&sock->scond);
isc_condition_destroy(&sock->cond);
isc_mutex_destroy(&sock->lock);
*sock = (isc_nmsocket_t){ .type = type,
.iface = *iface,
.fd = -1,
- .ah_size = 32,
.inactivehandles = isc_astack_new(
mgr->mctx, ISC_NM_HANDLES_STACK_SIZE),
.inactivereqs = isc_astack_new(
isc_nm_attach(mgr, &sock->mgr);
sock->uv_handle.handle.data = sock;
- sock->ah_frees = isc_mem_allocate(mgr->mctx,
- sock->ah_size * sizeof(size_t));
- sock->ah_handles = isc_mem_allocate(
- mgr->mctx, sock->ah_size * sizeof(isc_nmhandle_t *));
ISC_LINK_INIT(&sock->quotacb, link);
- for (size_t i = 0; i < 32; i++) {
- sock->ah_frees[i] = i;
- sock->ah_handles[i] = NULL;
- }
switch (type) {
case isc_nm_udpsocket:
isc___nmhandle_get(isc_nmsocket_t *sock, isc_sockaddr_t *peer,
isc_sockaddr_t *local FLARG) {
isc_nmhandle_t *handle = NULL;
- size_t handlenum;
- int pos;
REQUIRE(VALID_NMSOCK(sock));
handle->local = sock->iface;
}
- LOCK(&sock->lock);
- /* We need to add this handle to the list of active handles */
- if ((size_t)atomic_load(&sock->ah) == sock->ah_size) {
- sock->ah_frees =
- isc_mem_reallocate(sock->mgr->mctx, sock->ah_frees,
- sock->ah_size * 2 * sizeof(size_t));
- sock->ah_handles = isc_mem_reallocate(
- sock->mgr->mctx, sock->ah_handles,
- sock->ah_size * 2 * sizeof(isc_nmhandle_t *));
-
- for (size_t i = sock->ah_size; i < sock->ah_size * 2; i++) {
- sock->ah_frees[i] = i;
- sock->ah_handles[i] = NULL;
- }
-
- sock->ah_size *= 2;
- }
-
- handlenum = atomic_fetch_add(&sock->ah, 1);
- pos = sock->ah_frees[handlenum];
+ (void)atomic_fetch_add(&sock->ah, 1);
- INSIST(sock->ah_handles[pos] == NULL);
- sock->ah_handles[pos] = handle;
- handle->ah_pos = pos;
#ifdef NETMGR_TRACE
+ LOCK(&sock->lock);
ISC_LIST_APPEND(sock->active_handles, handle, active_link);
-#endif
UNLOCK(&sock->lock);
+#endif
switch (sock->type) {
case isc_nm_udpsocket:
static void
nmhandle_deactivate(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
- size_t handlenum;
bool reuse = false;
/*
*/
LOCK(&sock->lock);
- INSIST(sock->ah_handles[handle->ah_pos] == handle);
- INSIST(sock->ah_size > handle->ah_pos);
- INSIST(atomic_load(&sock->ah) > 0);
-
#ifdef NETMGR_TRACE
ISC_LIST_UNLINK(sock->active_handles, handle, active_link);
#endif
- sock->ah_handles[handle->ah_pos] = NULL;
- handlenum = atomic_fetch_sub(&sock->ah, 1) - 1;
- sock->ah_frees[handlenum] = handle->ah_pos;
- handle->ah_pos = 0;
+ INSIST(atomic_fetch_sub(&sock->ah, 1) > 0);
+
if (atomic_load(&sock->active)) {
reuse = isc_astack_trypush(sock->inactivehandles, handle);
}