summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cc4group.c57
-rw-r--r--src/cc4group.h2
-rw-r--r--src/cppc4group.cpp10
-rw-r--r--src/cppc4group.hpp2
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 = &copyMemoryManagement,
- .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)>;