libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stack_allocator_split_segment.cpp
Go to the documentation of this file.
1// Copyright 2023 owent
2
3#include <libcopp/utils/config/libcopp_build_features.h>
4
9
10// clang-format off
11#include <libcopp/utils/config/stl_include_prefix.h> // NOLINT(build/include_order)
12// clang-format on
13extern "C" {
14#include <signal.h>
15}
16
17#include <assert.h>
18#include <algorithm>
19#include <cstring>
20#include <limits>
21// clang-format off
22#include <libcopp/utils/config/stl_include_suffix.h> // NOLINT(build/include_order)
23// clang-format on
24
25#ifdef LIBCOPP_MACRO_USE_SEGMENTED_STACKS
26extern "C" {
27void *__splitstack_makecontext(std::size_t, void *[LIBCOPP_MACRO_SEGMENTED_STACK_NUMBER], std::size_t *);
28
29void __splitstack_releasecontext(void *[LIBCOPP_MACRO_SEGMENTED_STACK_NUMBER]);
30
31void __splitstack_resetcontext(void *[LIBCOPP_MACRO_SEGMENTED_STACK_NUMBER]);
32
33void __splitstack_block_signals_context(void *[LIBCOPP_MACRO_SEGMENTED_STACK_NUMBER], int *new_value, int *old_value);
34}
35#endif
36
37#ifdef LIBCOPP_HAS_ABI_HEADERS
38# include LIBCOPP_ABI_PREFIX
39#endif
40
41LIBCOPP_COPP_NAMESPACE_BEGIN
42namespace allocator {
43
44LIBCOPP_COPP_API stack_allocator_split_segment::stack_allocator_split_segment() LIBCOPP_MACRO_NOEXCEPT {}
49 const stack_allocator_split_segment &) LIBCOPP_MACRO_NOEXCEPT {
50 return *this;
51}
52
56 stack_allocator_split_segment &&) LIBCOPP_MACRO_NOEXCEPT {
57 return *this;
58}
59
61 std::size_t size) LIBCOPP_MACRO_NOEXCEPT {
62 void *start_ptr = __splitstack_makecontext(size, ctx.segments_ctx, &ctx.size);
63 assert(start_ptr);
64 if (!start_ptr) {
65 ctx.sp = nullptr;
66 return;
67 }
68
69 ctx.sp = static_cast<char *>(start_ptr) + ctx.size; // stack down
70
71 int off = 0;
72 __splitstack_block_signals_context(ctx.segments_ctx, &off, 0);
73}
74
75LIBCOPP_COPP_API void stack_allocator_split_segment::deallocate(stack_context &ctx) LIBCOPP_MACRO_NOEXCEPT {
76 __splitstack_releasecontext(ctx.segments_ctx);
77}
78} // namespace allocator
79LIBCOPP_COPP_NAMESPACE_END
80
81#ifdef LIBCOPP_HAS_ABI_HEADERS
82# include LIBCOPP_ABI_SUFFIX
83#endif
memory allocator this allocator will create buffer using gcc split segment api
void allocate(stack_context &, std::size_t) LIBCOPP_MACRO_NOEXCEPT
void deallocate(stack_context &) LIBCOPP_MACRO_NOEXCEPT
stack_allocator_split_segment & operator=(const stack_allocator_split_segment &other) LIBCOPP_MACRO_NOEXCEPT