From 712a61956cdd0e2e2907fb730b6dde9b5cc3524a Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sat, 20 Apr 2019 00:51:58 +0200 Subject: Add a custom arg to memory management strategies --- src/cc4group.c | 22 ++++++++++++++-------- src/cc4group.h | 6 ++++-- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/cc4group.c b/src/cc4group.c index 4f9839b..3782681 100644 --- a/src/cc4group.c +++ b/src/cc4group.c @@ -109,7 +109,7 @@ typedef struct { static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const management, const uint8_t** data, size_t size) { - void* newData = management->start((void*)*data, size); + void* newData = management->start((void*)*data, size, management->arg); if(newData == NULL) { return false; @@ -120,7 +120,7 @@ static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const static void cc4group_applyMemoryManagementEnd(CC4Group_MemoryManagement const management, const uint8_t* data) { - management->end((void*)data); + management->end((void*)data, management->arg); } static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4GroupEntryData* entry); @@ -2287,19 +2287,22 @@ static CC4Group* cc4group_openAsChild(CC4Group* const this, const char* const pa return child; } -static void* cc4group_memoryManagementTakeStart(void* const data, size_t const size) +static void* cc4group_memoryManagementTakeStart(void* const data, size_t const size, void* const arg) { (void)size; + (void)arg; return data; } -static void cc4group_memoryManagementTakeEnd(void* const data) +static void cc4group_memoryManagementTakeEnd(void* const data, void* const arg) { + (void)arg; free(data); } -static void* cc4group_memoryManagementCopyStart(void* const data, size_t const size) +static void* cc4group_memoryManagementCopyStart(void* const data, size_t const size, void* const arg) { + (void)arg; uint8_t* copy = malloc(size); if(copy == NULL) { @@ -2309,20 +2312,23 @@ static void* cc4group_memoryManagementCopyStart(void* const data, size_t const s return copy; } -static void cc4group_memoryManagementCopyEnd(void* const data) +static void cc4group_memoryManagementCopyEnd(void* const data, void* const arg) { + (void)arg; free(data); } -static void* cc4group_memoryManagementReferenceStart(void* const data, size_t const size) +static void* cc4group_memoryManagementReferenceStart(void* const data, size_t const size, void* const arg) { (void)size; + (void)arg; return data; } -static void cc4group_memoryManagementReferenceEnd(void* const data) +static void cc4group_memoryManagementReferenceEnd(void* const data, void* const arg) { (void)data; + (void)arg; } static CC4Group_MemoryManagement_t takeMemoryManagement = { diff --git a/src/cc4group.h b/src/cc4group.h index 0a3ceb4..780c50e 100644 --- a/src/cc4group.h +++ b/src/cc4group.h @@ -140,10 +140,12 @@ typedef void* (*CC4Group_TmpMemoryStrategy)(CC4Group* const this, const size_t s // actually, a memory management strategy is a pointer to an instance of this struct // it consists of a start function (like allocating some memory and making a copy) // and of an end function, which does the actual cleanup +// and an optional custom arg that will be passed to both functions // additionally to the predefined memory management strategies, custom strategies may be used typedef struct { - void* (*start)(void* const data, const size_t size); - void (*end)(void* const data); + void* (*start)(void* const data, const size_t size, void* const arg); + void (*end)(void* const data, void* const arg); + void* arg; } const CC4Group_MemoryManagement_t; typedef CC4Group_MemoryManagement_t* CC4Group_MemoryManagement; -- cgit v1.2.3-54-g00ecf