summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/aws/aws-c-common/source/memtrace.c
diff options
context:
space:
mode:
authorthegeorg <[email protected]>2025-05-12 15:51:24 +0300
committerthegeorg <[email protected]>2025-05-12 16:06:27 +0300
commitd629bb70c8773d2c0c43f5088ddbb5a86d8c37ea (patch)
tree4f678e0d65ad08c800db21c657d3b0f71fafed06 /contrib/restricted/aws/aws-c-common/source/memtrace.c
parent92c4b696d7a1c03d54e13aff7a7c20a078d90dd7 (diff)
Update contrib/restricted/aws libraries to nixpkgs 24.05
commit_hash:f8083acb039e6005e820cdee77b84e0a6b6c6d6d
Diffstat (limited to 'contrib/restricted/aws/aws-c-common/source/memtrace.c')
-rw-r--r--contrib/restricted/aws/aws-c-common/source/memtrace.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/contrib/restricted/aws/aws-c-common/source/memtrace.c b/contrib/restricted/aws/aws-c-common/source/memtrace.c
index 651fd93612a..9c5bff60cc0 100644
--- a/contrib/restricted/aws/aws-c-common/source/memtrace.c
+++ b/contrib/restricted/aws/aws-c-common/source/memtrace.c
@@ -57,7 +57,7 @@ struct alloc_tracer {
};
/* number of frames to skip in call stacks (s_alloc_tracer_track, and the vtable function) */
-#define FRAMES_TO_SKIP 2
+enum { FRAMES_TO_SKIP = 2 };
static void *s_trace_mem_acquire(struct aws_allocator *allocator, size_t size);
static void s_trace_mem_release(struct aws_allocator *allocator, void *ptr);
@@ -438,11 +438,18 @@ static void s_trace_mem_release(struct aws_allocator *allocator, void *ptr) {
static void *s_trace_mem_realloc(struct aws_allocator *allocator, void *old_ptr, size_t old_size, size_t new_size) {
struct alloc_tracer *tracer = allocator->impl;
void *new_ptr = old_ptr;
- if (aws_mem_realloc(tracer->traced_allocator, &new_ptr, old_size, new_size)) {
- return NULL;
- }
+ /*
+ * Careful with the ordering of state clean up here.
+ * Tracer keeps a hash table (alloc ptr as key) of meta info about each allocation.
+ * To avoid race conditions during realloc state update needs to be done in
+ * following order to avoid race conditions:
+ * - remove meta info (other threads cant reuse that key, cause ptr is still valid )
+ * - realloc (cant fail, ptr might remain the same)
+ * - add meta info for reallocated mem
+ */
s_alloc_tracer_untrack(tracer, old_ptr);
+ aws_mem_realloc(tracer->traced_allocator, &new_ptr, old_size, new_size);
s_alloc_tracer_track(tracer, new_ptr, new_size);
return new_ptr;