diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp index 7c8dc5e..e19c524 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp @@ -1,6 +1,14 @@ #include "SharedMemory.h" #include "Config.h" +/* +Function: createOrOpenMapping +Description: Creates or opens a file mapping and maps it into the process address space. +Parameters: + - mapping: MappingInfo&, mapping information and handles +Returns: + - bool: True if the mapping was successfully created/opened, otherwise false +*/ bool SharedMemory::createOrOpenMapping(MappingInfo& mapping) { if (mapping.recordSize == 0) @@ -84,3 +92,140 @@ bool SharedMemory::createOrOpenMapping(MappingInfo& mapping) mapping.mappedCapacity = header->capacity; return true; } + +/* +Function: closeMapping +Description: Unmaps and closes all resources associated with a file mapping. +Parameters: + - mapping: MappingInfo&, mapping to close +Returns: + - None +*/ +void SharedMemory::closeMapping(MappingInfo& mapping) +{ + if (mapping.mappedView != nullptr) + { + UnmapViewOfFile(mapping.mappedView); + mapping.mappedView = nullptr; + } + if (mapping.mappingHandle != NULL) + { + CloseHandle(mapping.mappingHandle); + mapping.mappingHandle = NULL; + } + if (mapping.fileHandle != INVALID_HANDLE_VALUE) + { + CloseHandle(mapping.fileHandle); + mapping.fileHandle = INVALID_HANDLE_VALUE; + } + mapping.mappedCapacity = 0; +} + +/* +Function: getHeader +Description: Returns the file header stored at the beginning of the mapped memory region. +Parameters: + - mapping: MappingInfo&, mapping information and handles +Returns: + - FileHeader*: Pointer to the file header, or nullptr if the mapping is not valid +*/ +FileHeader* SharedMemory::getHeader(MappingInfo& mapping) +{ + if (mapping.mappedView == nullptr) + { + return nullptr; + } + + return reinterpret_cast(mapping.mappedView); +} + +/* +Function: getRecordAddress +Description: Returns the address of a record at the specified index within the mapped memory region. +Parameters: + - mapping: MappingInfo&, mapping information and handles + - index: size_t, record index +Returns: + - void*: Pointer to the record, or nullptr if the mapping is not valid +*/ +void* SharedMemory::getRecordAddress(MappingInfo& mapping, size_t index) +{ + if (mapping.mappedView == nullptr) + { + return nullptr; + } + return reinterpret_cast(mapping.mappedView) + sizeof(FileHeader) + index * mapping.recordSize; +} + +/* +Function: getRecordAddress +Description: Returns the address of a record at the specified index within the mapped memory region. +Parameters: + - mapping: MappingInfo&, mapping information and handles + - index: size_t, record index +Returns: + - void*: Pointer to the record, or nullptr if the mapping is not valid +*/ +void* SharedMemory::getRecordAddress(MappingInfo& mapping, size_t index) +{ + if (mapping.mappedView == nullptr) + { + return nullptr; + } + return reinterpret_cast(mapping.mappedView) + sizeof(FileHeader) + index * mapping.recordSize; +} + +/* +Function: getRecordCount +Description: Returns the number of records currently stored in the mapping. +Parameters: + - mapping: MappingInfo&, mapping information and handles +Returns: + - size_t: Number of records in the mapping +*/ +size_t SharedMemory::getRecordCount(MappingInfo& mapping) +{ + FileHeader* header = getHeader(mapping); + if (header == nullptr) + { + return 0; + } + return header->recordCount; +} + +/* +Function: setRecordCount +Description: Updates the number of records stored in the mapping. +Parameters: + - mapping: MappingInfo&, mapping information and handles + - count: size_t, new record count +Returns: + - None +*/ +void SharedMemory::setRecordCount(MappingInfo& mapping, size_t count) +{ + FileHeader* header = getHeader(mapping); + if (header == nullptr) + { + return; + } + header->recordCount = count; +} + +/* +Function: getCapacity +Description: Returns the current capacity of the mapping. +Parameters: + - mapping: MappingInfo&, mapping information and handles +Returns: + - size_t: Maximum number of records that can be stored in the mapping +*/ +size_t SharedMemory::getCapacity(MappingInfo& mapping) +{ + FileHeader* header = getHeader(mapping); + if (header == nullptr) + { + return 0; + } + return header->capacity; +}