Skip to content

Commit 8eab158

Browse files
[libc] make integration test malloc work properly when threaded (#151622)
Make the simple bump allocation backed by atomic operations.
1 parent 5678aef commit 8eab158

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

libc/test/IntegrationTest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ add_object_library(
1313
DEPENDS
1414
libc.hdr.stdint_proxy
1515
libc.src.__support.OSUtil.osutil
16+
libc.src.__support.CPP.atomic
1617
${arch_specific_deps}
1718
)

libc/test/IntegrationTest/test.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
8-
98
#include "hdr/stdint_proxy.h"
9+
#include "src/__support/CPP/atomic.h"
1010
#include "src/__support/common.h"
1111
#include "src/__support/macros/config.h"
1212
#include <stddef.h>
@@ -65,14 +65,19 @@ int atexit(void (*func)(void)) { return LIBC_NAMESPACE::atexit(func); }
6565

6666
static constexpr uint64_t MEMORY_SIZE = 16384;
6767
static uint8_t memory[MEMORY_SIZE];
68-
static uint8_t *ptr = memory;
68+
static LIBC_NAMESPACE::cpp::Atomic<size_t> used = 0;
6969

7070
extern "C" {
7171

72+
// For simple test purposes.
7273
void *malloc(size_t s) {
73-
void *mem = ptr;
74-
ptr += s;
75-
return static_cast<uint64_t>(ptr - memory) >= MEMORY_SIZE ? nullptr : mem;
74+
// Emulate the alignment of std::max_align_t.
75+
constexpr size_t DEFAULT_ALIGNMENT = alignof(long double);
76+
s += (-s) & (DEFAULT_ALIGNMENT - 1); // Align to default alignment.
77+
auto res = used.fetch_add(s, LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED);
78+
if (res + s > MEMORY_SIZE)
79+
return nullptr; // Out of memory.
80+
return &memory[res];
7681
}
7782

7883
void free(void *) {}

0 commit comments

Comments
 (0)