diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2020-04-23 22:43:55 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2020-04-23 22:43:55 +0200 |
| commit | 0e367485f950b2ab7b9bd1b6c5e4a9b5d328a5dc (patch) | |
| tree | 3e5c4dc21173f0f78419c66ffdd69fe8f0dc8e64 /src | |
| parent | 1aafff7b2a13034922861032fc74baf60b42dcbc (diff) | |
| download | cc4group-0e367485f950b2ab7b9bd1b6c5e4a9b5d328a5dc.tar.gz cc4group-0e367485f950b2ab7b9bd1b6c5e4a9b5d328a5dc.zip | |
Store MemoryManagement by value instead of pointer
Diffstat (limited to 'src')
| -rw-r--r-- | src/cc4group.c | 57 | ||||
| -rw-r--r-- | src/cc4group.h | 2 | ||||
| -rw-r--r-- | src/cppc4group.cpp | 10 | ||||
| -rw-r--r-- | src/cppc4group.hpp | 2 |
4 files changed, 33 insertions, 38 deletions
diff --git a/src/cc4group.c b/src/cc4group.c index ad840f0..76531f1 100644 --- a/src/cc4group.c +++ b/src/cc4group.c @@ -144,7 +144,7 @@ typedef struct { static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const management, const uint8_t** data, size_t size) { - void* newData = management->start(data == NULL ? NULL : (void*)*data, size, management->arg); + void* newData = management.start(data == NULL ? NULL : (void*)*data, size, management.arg); if(newData == NULL) { return false; @@ -155,7 +155,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->arg); + management.end((void*)data, management.arg); } static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4GroupEntryData* const entry); @@ -2120,16 +2120,15 @@ static void* cc4group_mmappedFileManagementStart(void* const data, size_t const } typedef struct { - CC4Group_MemoryManagement_t management; size_t size; int fd; const CC4Group* group; -} CC4GroupMMappedFileManagement; +} CC4GroupMMappedFileManagementData; static void cc4group_mmappedFileManagementEnd(void* const data, void* const arg) { (void)data; - CC4GroupMMappedFileManagement* argData = arg; + CC4GroupMMappedFileManagementData* argData = arg; if(cc4group_munmap(data, argData->size) == -1) { cc4group_warn(argData->group, "munmap: unmapping a mmapped file failed: %s", strerror(errno)); @@ -2178,19 +2177,14 @@ static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4Gr return NULL; } - CC4GroupMMappedFileManagement* management = malloc(sizeof(*management)); + CC4GroupMMappedFileManagementData* management = malloc(sizeof(*management)); if(management == NULL) { SET_ERRNO_ERROR("malloc: allocating memory for temporary memory management"); return NULL; } - *management = (CC4GroupMMappedFileManagement){ - .management = { - .start = cc4group_mmappedFileManagementStart, - .end = cc4group_mmappedFileManagementEnd, - .arg = management - }, + *management = (CC4GroupMMappedFileManagementData){ .size = entry->core.Size, .fd = -1, .group = this @@ -2202,7 +2196,11 @@ static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4Gr } ((C4GroupEntryData*)entry)->data = mapped; - ((C4GroupEntryData*)entry)->memoryManagement = &management->management; + ((C4GroupEntryData*)entry)->memoryManagement = (CC4Group_MemoryManagement){ + .start = cc4group_mmappedFileManagementStart, + .end = cc4group_mmappedFileManagementEnd, + .arg = management + }; } return entry->data; @@ -3421,21 +3419,6 @@ static void cc4group_memoryManagementReferenceEnd(void* const data, void* const (void)arg; } -static CC4Group_MemoryManagement_t takeMemoryManagement = { - .start = cc4group_memoryManagementTakeStart, - .end = cc4group_memoryManagementTakeEnd, -}; - -static CC4Group_MemoryManagement_t copyMemoryManagement = { - .start = cc4group_memoryManagementCopyStart, - .end = cc4group_memoryManagementCopyEnd, -}; - -static CC4Group_MemoryManagement_t referenceMemoryManagement = { - .start = cc4group_memoryManagementReferenceStart, - .end = cc4group_memoryManagementReferenceEnd, -}; - CC4Group_API cc4group = { .AllowedEntryTypes = { .File = CC4Group_AllowedEntryTypes_File, @@ -3444,9 +3427,21 @@ CC4Group_API cc4group = { }, .MemoryManagement = { - .Take = &takeMemoryManagement, - .Copy = ©MemoryManagement, - .Reference = &referenceMemoryManagement + .Take = { + .start = cc4group_memoryManagementTakeStart, + .end = cc4group_memoryManagementTakeEnd, + .arg = NULL + }, + .Copy = { + .start = cc4group_memoryManagementCopyStart, + .end = cc4group_memoryManagementCopyEnd, + .arg = NULL + }, + .Reference = { + .start = cc4group_memoryManagementReferenceStart, + .end = cc4group_memoryManagementReferenceEnd, + .arg = NULL + } }, diff --git a/src/cc4group.h b/src/cc4group.h index 25f3c53..7e871a2 100644 --- a/src/cc4group.h +++ b/src/cc4group.h @@ -149,7 +149,7 @@ typedef struct { void (*end)(void* const data, void* const arg); void* arg; } CC4Group_MemoryManagement_t; -typedef CC4Group_MemoryManagement_t* CC4Group_MemoryManagement; +typedef CC4Group_MemoryManagement_t CC4Group_MemoryManagement; // callback types for openWithReadCallback diff --git a/src/cppc4group.cpp b/src/cppc4group.cpp index 09a27e1..2c69b98 100644 --- a/src/cppc4group.cpp +++ b/src/cppc4group.cpp @@ -43,7 +43,7 @@ struct CppC4Group::Private { struct CppC4Group::MemoryManagement::Private { struct CustomMemoryManagement { - CC4Group_MemoryManagement_t realMemoryManagement; + CC4Group_MemoryManagement realMemoryManagement; Start start; End end; @@ -148,9 +148,9 @@ CppC4Group::MemoryManagement::MemoryManagementStrategy CppC4Group::MemoryManagem return p->strategy; } -const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Take{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(cc4group.MemoryManagement.Take)}; -const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Copy{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(cc4group.MemoryManagement.Copy)}; -const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Reference{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(cc4group.MemoryManagement.Reference)}; +const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Take{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(&cc4group.MemoryManagement.Take)}; +const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Copy{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(&cc4group.MemoryManagement.Copy)}; +const CppC4Group::MemoryManagement CppC4Group::MemoryManagement::Reference{reinterpret_cast<MemoryManagement::MemoryManagementStrategy>(&cc4group.MemoryManagement.Reference)}; namespace { int convertAllowedEntryTypes(const CppC4Group::AllowedEntryTypes allowedEntryTypes) @@ -184,7 +184,7 @@ namespace { CC4Group_MemoryManagement convertMemoryManagement(const CppC4Group::MemoryManagement& memoryManagement) { - return reinterpret_cast<CC4Group_MemoryManagement>(memoryManagement()); + return *reinterpret_cast<const CC4Group_MemoryManagement*>(memoryManagement()); } } diff --git a/src/cppc4group.hpp b/src/cppc4group.hpp index 42bef77..ae8b3b3 100644 --- a/src/cppc4group.hpp +++ b/src/cppc4group.hpp @@ -81,7 +81,7 @@ public: class MemoryManagement { public: struct MemoryManagementStrategy_t; - using MemoryManagementStrategy = MemoryManagementStrategy_t*; + using MemoryManagementStrategy = const MemoryManagementStrategy_t*; using Start = std::function<void*(void* memory, size_t size)>; using End = std::function<void(void* memory)>; |
