1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/cxx_ctor_guards/doc.txt
Jens Wetterich a0930a8ec0 doc: Improve C++ documentation
Move C++ modules in a new menu tree and improve the description.
2021-12-15 18:58:23 +01:00

52 lines
2.1 KiB
Plaintext

/**
@defgroup sys_cxx_ctor_guards C++ constructor guards for static instances
@ingroup cpp
@brief C++ constructor guards for thread-safe initialization of static
instances
@warning This implementation is likely only compatible with `g++`
# Introduction
The libstd++ ABI requires implementations of the following functions:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c}
int __cxa_guard_acquire(__guard *g);
void __cxa_guard_release(__guard *g);
void __cxa_guard_abort(__guard *g);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These functions are not intended to be ever used by the programmer, instead
the C++ compiler will emit code calling them if statically allocated class
instances are used. In a multi-threaded environment special care needs to be
taken to prevent race conditions while initializing and using such instances.
This modules provides them.
# Usage
This module is intended to be used by platforms that want to provide C++
support, but the used standard C++ library does not provide these guards. In
this case, adding this module will do the trick. The programmer / user should
never interact with any of the functions.
Note that on some platforms the type `__guard` is defined differently from the
"generic" definition, most notably ARM. For those platforms a header named
`cxx_ctor_guards_arch.h` needs to be created containing the correct `typedef`
and the preprocessor macro `CXX_CTOR_GUARDS_CUSTOM_TYPE` needs to be defined.
# Implementation
This implementation provides the C++ ctor guards as defined by the libstd++ ABI
used in g++. It will likely not be compatible with other implementations of
libstd++.
The libstd++ ABI expects the functions to be implemented as C functions. Most
implementations will put the code into C++ files and wrap everything into an
`extern "C" {...}`. This implementation will just use a plain C file for less
boilerplate.
The implementation intentionally makes only use of a single byte of the
`__guard` type. This should result in the implementation being usable on any
platform, regardless of the actual size of `__guard`.
*/