2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-22 01:59:26 +00:00
bind/lib/isc/uv.c
Ondřej Surý f7e5c1db38
Change the 'isc_g_mctx' to be always available
This required couple of internal changes to the isc_mem_debugging.

The isc_mem_debugging is now internal to isc_mem unit and there are
three new functions:

1. isc_mem_setdebugging() can change the debugging setting for an
   individual memory context.  This is need for the memory contexts used
   for OpenSSL, libxml and libuv accounting as recording and tracing
   memory is broken there.

2. isc_mem_debugon() / isc_mem_debugoff() can be used to change default
   memory debugging flags as well as debugging flags for isc_g_mctx.

Additionally, the memory debugging is inconsistent across the code-base.
For now, we are keeping the existing flags, but three new environment
variables have been added 'ISC_MEM_DEBUGRECORD', 'ISC_MEM_DEBUGTRACE'
and 'ISC_MEM_DEBUGUSAGE' to set the global debugging flags at any
program using the memory contexts.
2025-08-04 11:29:50 +02:00

161 lines
3.8 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <unistd.h>
#include <isc/mem.h>
#include <isc/util.h>
#include <isc/uv.h>
/*%
* Convert a libuv error value into an isc_result_t. The
* list of supported error values is not complete; new users
* of this function should add any expected errors that are
* not already there.
*/
isc_result_t
isc__uverr2result(int uverr, bool dolog, const char *file, unsigned int line,
const char *func) {
switch (uverr) {
case 0:
return ISC_R_SUCCESS;
case UV_ENOTDIR:
case UV_ELOOP:
case UV_EINVAL: /* XXX sometimes this is not for files */
case UV_ENAMETOOLONG:
case UV_EBADF:
return ISC_R_INVALIDFILE;
case UV_ENOENT:
return ISC_R_FILENOTFOUND;
case UV_EAGAIN:
return ISC_R_NOCONN;
case UV_EACCES:
case UV_EPERM:
return ISC_R_NOPERM;
case UV_EEXIST:
return ISC_R_FILEEXISTS;
case UV_EIO:
return ISC_R_IOERROR;
case UV_ENOMEM:
return ISC_R_NOMEMORY;
case UV_ENFILE:
case UV_EMFILE:
return ISC_R_TOOMANYOPENFILES;
case UV_ENOSPC:
return ISC_R_DISCFULL;
case UV_EPIPE:
case UV_ECONNRESET:
case UV_ECONNABORTED:
return ISC_R_CONNECTIONRESET;
case UV_ENOTCONN:
return ISC_R_NOTCONNECTED;
case UV_ETIMEDOUT:
return ISC_R_TIMEDOUT;
case UV_ENOBUFS:
return ISC_R_NORESOURCES;
case UV_EAFNOSUPPORT:
return ISC_R_FAMILYNOSUPPORT;
case UV_ENETDOWN:
return ISC_R_NETDOWN;
case UV_EHOSTDOWN:
return ISC_R_HOSTDOWN;
case UV_ENETUNREACH:
return ISC_R_NETUNREACH;
case UV_EHOSTUNREACH:
return ISC_R_HOSTUNREACH;
case UV_EADDRINUSE:
return ISC_R_ADDRINUSE;
case UV_EADDRNOTAVAIL:
return ISC_R_ADDRNOTAVAIL;
case UV_ECONNREFUSED:
return ISC_R_CONNREFUSED;
case UV_ECANCELED:
return ISC_R_CANCELED;
case UV_EOF:
return ISC_R_EOF;
case UV_EMSGSIZE:
return ISC_R_MAXSIZE;
case UV_ENOTSUP:
return ISC_R_FAMILYNOSUPPORT;
case UV_ENOPROTOOPT:
case UV_EPROTONOSUPPORT:
return ISC_R_INVALIDPROTO;
default:
if (dolog) {
UNEXPECTED_ERROR("unable to convert libuv error code "
"in %s (%s:%d) to isc_result: %d: %s",
func, file, line, uverr,
uv_strerror(uverr));
}
return ISC_R_UNEXPECTED;
}
}
#if UV_VERSION_HEX >= UV_VERSION(1, 38, 0)
static isc_mem_t *isc__uv_mctx = NULL;
static void *
isc__uv_malloc(size_t size) {
return isc_mem_allocate(isc__uv_mctx, size);
}
static void *
isc__uv_realloc(void *ptr, size_t size) {
return isc_mem_reallocate(isc__uv_mctx, ptr, size);
}
static void *
isc__uv_calloc(size_t count, size_t size) {
return isc_mem_callocate(isc__uv_mctx, count, size);
}
static void
isc__uv_free(void *ptr) {
if (ptr == NULL) {
return;
}
isc_mem_free(isc__uv_mctx, ptr);
}
#endif /* UV_VERSION_HEX >= UV_VERSION(1, 38, 0) */
void
isc__uv_initialize(void) {
#if UV_VERSION_HEX >= UV_VERSION(1, 38, 0)
int r;
isc_mem_create("uv", &isc__uv_mctx);
isc_mem_setdebugging(isc__uv_mctx, 0);
isc_mem_setdestroycheck(isc__uv_mctx, false);
r = uv_replace_allocator(isc__uv_malloc, isc__uv_realloc,
isc__uv_calloc, isc__uv_free);
UV_RUNTIME_CHECK(uv_replace_allocator, r);
#endif /* UV_VERSION_HEX >= UV_VERSION(1, 38, 0) */
}
void
isc__uv_shutdown(void) {
#if UV_VERSION_HEX >= UV_VERSION(1, 38, 0)
uv_library_shutdown();
isc_mem_detach(&isc__uv_mctx);
#endif /* UV_VERSION_HEX < UV_VERSION(1, 38, 0) */
}
void
isc__uv_setdestroycheck(bool check) {
#if UV_VERSION_HEX >= UV_VERSION(1, 38, 0)
isc_mem_setdestroycheck(isc__uv_mctx, check);
#else
UNUSED(check);
#endif /* UV_VERSION_HEX >= UV_VERSION(1, 6, 0) */
}