From c6ff6ad31d36a1970ad8c22887031b0ba7cfeca9 Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Wed, 16 Oct 2024 17:18:14 +0200 Subject: [PATCH 1/3] Changed size_query and destructor call order --- src/TracingHeap/TracingHeap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TracingHeap/TracingHeap.c b/src/TracingHeap/TracingHeap.c index bab34e4..a81e286 100644 --- a/src/TracingHeap/TracingHeap.c +++ b/src/TracingHeap/TracingHeap.c @@ -29,8 +29,8 @@ int TracingHeap_Create(TracingHeap* self, allocator_t* allocator) static void _TracingHeap_ForceDestroyObject(TracingHeap* self, TracingObject* object) { - self->config.destructor(self->config.destructor_context, object->data); size_t allocated_size = self->config.size_query(self->config.size_query_context, object->data); + self->config.destructor(self->config.destructor_context, object->data); Allocator_Free(self->allocator, object, allocated_size); } @@ -166,13 +166,13 @@ size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n) static int _TracingHeap_DestroyObject(TracingHeap* self, TracingObject* unreachable_object) { + size_t allocated_size = self->config.size_query(self->config.size_query_context, unreachable_object->data); + int destructor_code = self->config.destructor(self->config.destructor_context, unreachable_object->data); if (destructor_code) { return destructor_code; } - size_t allocated_size = self->config.size_query(self->config.size_query_context, unreachable_object->data); - Allocator_Free(self->allocator, unreachable_object, allocated_size); return EXIT_SUCCESS; From d3722aac834730c8a8c710f94507d7c2ffb68abf Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Wed, 16 Oct 2024 17:23:37 +0200 Subject: [PATCH 2/3] Implemented IsTraceFinished, removed global linked list --- src/TracingHeap/TracingHeap.c | 24 ++++++++++++++---------- src/TracingHeap/TracingHeap.h | 5 ++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/TracingHeap/TracingHeap.c b/src/TracingHeap/TracingHeap.c index a81e286..1da3910 100644 --- a/src/TracingHeap/TracingHeap.c +++ b/src/TracingHeap/TracingHeap.c @@ -16,7 +16,6 @@ int TracingHeap_Create(TracingHeap* self, allocator_t* allocator) self->allocator = allocator; - self->objects = NULL; self->black_objects = NULL; self->white_objects = NULL; self->grey_objects = NULL; @@ -40,7 +39,13 @@ void TracingHeap_Destroy(TracingHeap* self) return; } - for (TracingObject* object = self->objects; object != NULL; object = object->global_next) { + for (TracingObject* object = self->white_objects; object != NULL; object = object->color_next) { + _TracingHeap_ForceDestroyObject(self, object); + } + for (TracingObject* object = self->grey_objects; object != NULL; object = object->color_next) { + _TracingHeap_ForceDestroyObject(self, object); + } + for (TracingObject* object = self->black_objects; object != NULL; object = object->color_next) { _TracingHeap_ForceDestroyObject(self, object); } @@ -199,6 +204,11 @@ int TracingHeap_BeginTrace(TracingHeap* self) return EXIT_SUCCESS; } +bool TracingHeap_IsTraceFinished(TracingHeap* self) +{ + return self->grey_objects == NULL; +} + int TracingHeap_EndTrace(TracingHeap* self) { if (self == NULL) { @@ -212,11 +222,11 @@ int TracingHeap_EndTrace(TracingHeap* self) TracingObject* unreachable_object = *unreachable_list; while (unreachable_object != NULL) { - TracingObject* next_unreachable = unreachable_object->global_next; + TracingObject* next_unreachable = unreachable_object->color_next; if (_TracingHeap_DestroyObject(self, unreachable_object)) { *unreachable_list = unreachable_object; - unreachable_object->global_prev = NULL; + unreachable_object->color_prev = NULL; return ECANCELED; } @@ -246,11 +256,5 @@ void* TracingHeap_Allocate(TracingHeap* self, size_t bytes) *reachable_list_start = object; object->color_prev = NULL; - - object->global_next = self->objects; // link before global object list - object->global_prev = NULL; // no previous object - self->objects->global_prev = object; // link first object via previous link - self->objects = object; // insert into linked list - return object->data; } diff --git a/src/TracingHeap/TracingHeap.h b/src/TracingHeap/TracingHeap.h index fbc1c92..aeb2dbc 100644 --- a/src/TracingHeap/TracingHeap.h +++ b/src/TracingHeap/TracingHeap.h @@ -4,6 +4,7 @@ #include "../allocator-interface/allocator-interface.h" #include +#include enum TracingColor { TRACINGCOLOR_BLACK, @@ -12,8 +13,6 @@ enum TracingColor { }; typedef struct TracingObject { - struct TracingObject* global_next; - struct TracingObject* global_prev; struct TracingObject* color_next; struct TracingObject* color_prev; enum TracingColor color; @@ -39,7 +38,6 @@ typedef struct TracingHeapConfig_s { } TracingHeapConfig; typedef struct TracingHeap_s { - TracingObject* objects; TracingObject* white_objects; TracingObject* grey_objects; TracingObject* black_objects; @@ -57,6 +55,7 @@ void TracingHeap_Destroy(TracingHeap* self); void* TracingHeap_Allocate(TracingHeap* self, size_t bytes); int TracingHeap_BeginTrace(TracingHeap* self); +bool TracingHeap_IsTraceFinished(TracingHeap* self); int TracingHeap_EndTrace(TracingHeap* self); int TracingHeap_TraceNext(TracingHeap* self); size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n); From 840b19adf2cb7a2f3a99c34e82842d966629ffad Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Wed, 16 Oct 2024 17:25:33 +0200 Subject: [PATCH 3/3] Added optional pointer return in TraceNextN --- src/TracingHeap/TracingHeap.c | 6 ++++-- src/TracingHeap/TracingHeap.h | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/TracingHeap/TracingHeap.c b/src/TracingHeap/TracingHeap.c index 1da3910..5be63b8 100644 --- a/src/TracingHeap/TracingHeap.c +++ b/src/TracingHeap/TracingHeap.c @@ -158,10 +158,12 @@ int TracingHeap_TraceNext(TracingHeap* self) return EXIT_SUCCESS; } -size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n) +size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n, int* error_code) { for (size_t i = 0; i < n; i++) { - if (TracingHeap_TraceNext(self)) { + int trace_code = TracingHeap_TraceNext(self); + if (trace_code != EXIT_SUCCESS) { + if (error_code != NULL) *error_code = trace_code; return i; } } diff --git a/src/TracingHeap/TracingHeap.h b/src/TracingHeap/TracingHeap.h index aeb2dbc..cfe4c60 100644 --- a/src/TracingHeap/TracingHeap.h +++ b/src/TracingHeap/TracingHeap.h @@ -49,16 +49,17 @@ typedef struct TracingHeap_s { allocator_t* allocator; } TracingHeap; -int TracingHeap_Create(TracingHeap* self, allocator_t* allocator); -void TracingHeap_Destroy(TracingHeap* self); +int TracingHeap_Create(TracingHeap* self, allocator_t* allocator); +void TracingHeap_Destroy(TracingHeap* self); -void* TracingHeap_Allocate(TracingHeap* self, size_t bytes); +void* TracingHeap_Allocate(TracingHeap* self, size_t bytes); int TracingHeap_BeginTrace(TracingHeap* self); bool TracingHeap_IsTraceFinished(TracingHeap* self); int TracingHeap_EndTrace(TracingHeap* self); + int TracingHeap_TraceNext(TracingHeap* self); -size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n); +size_t TracingHeap_TraceNextN(TracingHeap* self, size_t n, int* error_code); int TracingHeap_AddTracingRoot(TracingHeap* self, void* data); #endif // header