mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-28 21:17:54 +00:00
The current isc_hp API uses internal tid_v variable that gets incremented for each new thread using hazard pointers. This tid_v variable is then used as a index to global shared table with hazard pointers state. Since the tid_v is only incremented and never decremented the table could overflow very quickly if we create set of threads for short period of time, they finish the work and cease to exist. Then we create identical set of threads and so on and so on. This is not a problem for a normal `named` operation as the set of threads is stable, but the problematic place are the unit tests where we test network manager or other APIs (task, timer) that create threads. This commits adds a thin wrapper around any function called from isc_thread_create() that adds unique-but-reusable small digit thread id that can be used as index to f.e. hazard pointer tables. The trampoline wrapper ensures that the thread ids will be reused, so the highest thread_id number doesn't grow indefinitely when threads are created and destroyed and then created again. This fixes the hazard pointer table overflow on machines with many cores. [GL #2396]
51 lines
967 B
C
51 lines
967 B
C
/*
|
|
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/*! \file */
|
|
|
|
#include <isc/bind9.h>
|
|
#include <isc/lib.h>
|
|
#include <isc/mem.h>
|
|
#include <isc/tls.h>
|
|
#include <isc/util.h>
|
|
|
|
#include "mem_p.h"
|
|
#include "tls_p.h"
|
|
#include "trampoline_p.h"
|
|
|
|
/***
|
|
*** Functions
|
|
***/
|
|
|
|
void
|
|
isc_lib_register(void) {
|
|
isc_bind9 = false;
|
|
}
|
|
|
|
void
|
|
isc__initialize(void) ISC_CONSTRUCTOR(101);
|
|
void
|
|
isc__shutdown(void) ISC_DESTRUCTOR(101);
|
|
|
|
void
|
|
isc__initialize(void) {
|
|
isc__mem_initialize();
|
|
isc__tls_initialize();
|
|
isc__trampoline_initialize();
|
|
}
|
|
|
|
void
|
|
isc__shutdown(void) {
|
|
isc__trampoline_shutdown();
|
|
isc__tls_shutdown();
|
|
isc__mem_shutdown();
|
|
}
|