Skip to content

Commit

Permalink
perf: use C23's free_sized when available
Browse files Browse the repository at this point in the history
This only has an effect on systems with a default allocator where `free_sized` is faster than `free`.

See https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2699.htm for an explanation of this feature.

Co-authored-by: Eric Wieser <[email protected]>
  • Loading branch information
ckennelly and eric-wieser committed Jan 10, 2025
1 parent 2c9641f commit 96ee3bf
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 4 deletions.
7 changes: 6 additions & 1 deletion src/include/lean/lean.h
Original file line number Diff line number Diff line change
Expand Up @@ -380,11 +380,16 @@ static inline unsigned lean_small_object_size(lean_object * o) {
void free(void *); // avoid including big `stdlib.h`
#endif

#if !defined(__STDC_VERSION_STDLIB_H__) || __STDC_VERSION_STDLIB_H__ < 202311L
void free_sized(void* ptr, size_t);
#endif

static inline void lean_free_small_object(lean_object * o) {
#ifdef LEAN_SMALL_ALLOCATOR
lean_free_small(o);
#else
free((size_t*)o - 1);
size_t* ptr = (size_t*)o - 1;
free_sized(ptr, *ptr + sizeof(size_t));
#endif
}

Expand Down
2 changes: 1 addition & 1 deletion src/library/module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ extern "C" LEAN_EXPORT object * lean_read_module_data(object * fname, object *)
#endif
buffer = static_cast<char *>(malloc(size - sizeof(olean_header)));
free_data = [=]() {
free(buffer);
free_sized(buffer, size - sizeof(olean_header));
};
in.read(buffer, size - sizeof(olean_header));
if (!in) {
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/alloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ void dealloc(void * o, size_t sz) {
LEAN_RUNTIME_STAT_CODE(g_num_dealloc++);
sz = lean_align(sz, LEAN_OBJECT_SIZE_DELTA);
if (LEAN_UNLIKELY(sz > LEAN_MAX_SMALL_OBJECT_SIZE)) {
return free(o);
return free_sized(o, sz);
}
dealloc_small_core(o);
}
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ static inline void lean_dealloc(lean_object * o, size_t sz) {
#ifdef LEAN_SMALL_ALLOCATOR
dealloc(o, sz);
#else
free(o);
free_sized(o, sz);
#endif
}

Expand Down

0 comments on commit 96ee3bf

Please sign in to comment.