mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-05 09:05:40 +00:00
Move registration and deregistration of the main thread from `isc_loopmgr_run()` into `isc__initialize()` / `isc__shutdown()`: liburcu-qsbr fails an assertion if we try to use it from an unregistered thread, and we need to be able to use it when the event loops are not running. Use `rcu_assign_pointer()` and `rcu_dereference()` in qp-trie transactions so that they properly mark threads as online. The RCU-protected pointer is no longer declared atomic because liburcu does not (yet) use standard C atomics. Fix the definition of `isc_qsbr_rcu_dereference()` to return the referenced value, and to call the right function inside liburcu. Change the thread sanitizer suppressions to match any variant of `rcu_*_barrier()`
71 lines
1.5 KiB
C
71 lines
1.5 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.
|
|
*/
|
|
|
|
/*! \file */
|
|
|
|
#include <isc/iterated_hash.h>
|
|
#include <isc/md.h>
|
|
#include <isc/mem.h>
|
|
#include <isc/os.h>
|
|
#include <isc/tls.h>
|
|
#include <isc/urcu.h>
|
|
#include <isc/util.h>
|
|
#include <isc/uv.h>
|
|
#include <isc/xml.h>
|
|
|
|
#include "config.h"
|
|
#include "mem_p.h"
|
|
#include "mutex_p.h"
|
|
#include "os_p.h"
|
|
|
|
#ifndef ISC_CONSTRUCTOR
|
|
#error Either __attribute__((constructor|destructor))__ or DllMain support needed to compile BIND 9.
|
|
#endif
|
|
|
|
/***
|
|
*** Functions
|
|
***/
|
|
|
|
void
|
|
isc__initialize(void) ISC_CONSTRUCTOR;
|
|
void
|
|
isc__shutdown(void) ISC_DESTRUCTOR;
|
|
|
|
void
|
|
isc__initialize(void) {
|
|
isc__os_initialize();
|
|
isc__mutex_initialize();
|
|
isc__mem_initialize();
|
|
isc__tls_initialize();
|
|
isc__uv_initialize();
|
|
isc__xml_initialize();
|
|
isc__md_initialize();
|
|
isc__iterated_hash_initialize();
|
|
(void)isc_os_ncpus();
|
|
rcu_register_thread();
|
|
}
|
|
|
|
void
|
|
isc__shutdown(void) {
|
|
isc__iterated_hash_shutdown();
|
|
isc__md_shutdown();
|
|
isc__xml_shutdown();
|
|
isc__uv_shutdown();
|
|
isc__tls_shutdown();
|
|
isc__mem_shutdown();
|
|
isc__mutex_shutdown();
|
|
isc__os_shutdown();
|
|
/* should be after isc__mem_shutdown() which calls rcu_barrier() */
|
|
rcu_unregister_thread();
|
|
}
|