0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-05-19 19:33:45 +02:00

ircd::mapi: Annotate noexcept; non-dynamic alloc; codegen reduction all modules.

This commit is contained in:
Jason Volk 2023-03-04 17:00:50 -08:00
parent 0e5b1907d2
commit f3a1416f65
2 changed files with 22 additions and 14 deletions

View file

@ -89,6 +89,15 @@ IRCD_MAPI_SERIAL
4 4
}; };
struct ircd::mapi::metablock
{
init_func init; // Executed after dlopen()
fini_func fini; // Executed before dlclose()
meta_data meta; // Various key-value metadata
metablock(const string_view, init_func &&, fini_func &&) noexcept;
};
/// Module Header /// Module Header
/// ///
/// A static instance of this class must be included in an IRCd module with /// A static instance of this class must be included in an IRCd module with
@ -113,22 +122,16 @@ struct ircd::mapi::header
operator const mods::mod &() const; operator const mods::mod &() const;
operator mods::mod &(); operator mods::mod &();
header(const string_view &, header(const string_view,
init_func = {}, init_func = {},
fini_func = {}); fini_func = {});
header(header &&) = delete; header(header &&) = delete;
header(const header &) = delete; header(const header &) = delete;
~header() noexcept; ~header() noexcept;
};
struct ircd::mapi::metablock // Non-throwing allocations
{ static uint8_t body[sizeof(metablock)];
init_func init; // Executed after dlopen()
fini_func fini; // Executed before dlclose()
meta_data meta; // Various key-value metadata
metablock(const string_view &, init_func &&, fini_func &&);
}; };
static_assert static_assert
@ -144,14 +147,17 @@ static_assert
"The MAPI header size has changed on this platform." "The MAPI header size has changed on this platform."
); );
inline decltype(ircd::mapi::header::body)
ircd::mapi::header::body;
inline inline
__attribute__((always_inline)) __attribute__((always_inline))
ircd::mapi::header::header(const string_view &description, ircd::mapi::header::header(const string_view description,
init_func init, init_func init,
fini_func fini) fini_func fini)
:meta :meta
{ {
new metablock new (body) metablock
{ {
description, std::move(init), std::move(fini) description, std::move(init), std::move(fini)
} }

View file

@ -403,9 +403,10 @@ const
// metablock // metablock
// //
ircd::mapi::metablock::metablock(const string_view &description, ircd::mapi::metablock::metablock(const string_view description,
init_func &&init_func, init_func &&init_func,
fini_func &&fini_func) fini_func &&fini_func)
noexcept
:init{std::move(init_func)} :init{std::move(init_func)}
,fini{std::move(fini_func)} ,fini{std::move(fini_func)}
,meta ,meta
@ -422,8 +423,9 @@ ircd::mapi::metablock::metablock(const string_view &description,
ircd::mapi::header::~header() ircd::mapi::header::~header()
noexcept noexcept
{ {
delete meta; assert(meta);
meta = nullptr; if(likely(meta))
meta->meta.clear();
static_destruction = true; static_destruction = true;
} }