netmgr_wrap.c revision 1.1 1 /* $NetBSD: netmgr_wrap.c,v 1.1 2025/01/26 16:12:36 christos Exp $ */
2
3 /*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16 /*! \file */
17
18 #include <isc/atomic.h>
19 #include <isc/netmgr.h>
20 #include <isc/util.h>
21
22 #include <dns/view.h>
23
24 #include <ns/client.h>
25
26 #if ISC_NETMGR_TRACE
27 #define FLARG \
28 , const char *func ISC_ATTR_UNUSED, const char *file ISC_ATTR_UNUSED, \
29 unsigned int line ISC_ATTR_UNUSED
30 #else
31 #define FLARG
32 #endif
33
34 /*
35 * We don't want to use netmgr-based client accounting, we need to emulate it.
36 */
37 atomic_uint_fast32_t client_refs[32];
38 atomic_uintptr_t client_addrs[32];
39
40 #if ISC_NETMGR_TRACE
41 void
42 isc_nmhandle__attach(isc_nmhandle_t *source, isc_nmhandle_t **targetp FLARG) {
43 #else
44 void
45 isc_nmhandle_attach(isc_nmhandle_t *source, isc_nmhandle_t **targetp) {
46 #endif
47 ns_client_t *client = (ns_client_t *)source;
48 int i;
49
50 for (i = 0; i < 32; i++) {
51 if (atomic_load(&client_addrs[i]) == (uintptr_t)client) {
52 break;
53 }
54 }
55 INSIST(i < 32);
56 INSIST(atomic_load(&client_refs[i]) > 0);
57
58 atomic_fetch_add(&client_refs[i], 1);
59 #if 0
60 fprintf(stderr, "%s:%s:%s:%d -> %ld\n", __func__, func, file, line,
61 client_refs[i]);
62 #endif
63
64 *targetp = source;
65 return;
66 }
67
68 #if ISC_NETMGR_TRACE
69 void
70 isc_nmhandle__detach(isc_nmhandle_t **handlep FLARG) {
71 #else
72 void
73 isc_nmhandle_detach(isc_nmhandle_t **handlep) {
74 #endif
75 isc_nmhandle_t *handle = *handlep;
76 ns_client_t *client = (ns_client_t *)handle;
77 int i;
78
79 *handlep = NULL;
80
81 for (i = 0; i < 32; i++) {
82 if (atomic_load(&client_addrs[i]) == (uintptr_t)client) {
83 break;
84 }
85 }
86 INSIST(i < 32);
87
88 if (atomic_fetch_sub(&client_refs[i], 1) == 1) {
89 dns_view_detach(&client->view);
90 client->state = 4;
91 ns__client_reset_cb(client);
92 ns__client_put_cb(client);
93 atomic_store(&client_addrs[i], (uintptr_t)NULL);
94 }
95 #if 0
96 fprintf(stderr, "%s:%s:%s:%d -> %ld\n", __func__, func, file, line,
97 client_refs[i]);
98 #endif
99
100 return;
101 }
102