From c459515071a28c66f40857bcd95b818e3857fafe Mon Sep 17 00:00:00 2001 From: fancy <258828110.@qq.com> Date: Wed, 1 Nov 2023 08:29:26 -0700 Subject: [PATCH] Improve shared data module. --- test/utils/SharedData/src/SharedDataTest.cpp | 21 +++- utils/SharedData/include/SharedData.h | 4 +- utils/SharedData/src/SharedDataImpl.cpp | 102 +++++++++++++++---- utils/SharedData/src/SharedDataImpl.h | 20 +++- 4 files changed, 120 insertions(+), 27 deletions(-) diff --git a/test/utils/SharedData/src/SharedDataTest.cpp b/test/utils/SharedData/src/SharedDataTest.cpp index f9bf1c9..f986684 100644 --- a/test/utils/SharedData/src/SharedDataTest.cpp +++ b/test/utils/SharedData/src/SharedDataTest.cpp @@ -23,11 +23,24 @@ namespace SharedDataTest { CreateLogModule(); ILogInit(LOG_INSTANCE_TYPE_END); - SharedData *sharedData = CreateSharedData(SHARER_NAME_PRIMARY, "./shared_file", 9); - if (nullptr != sharedData) + constexpr int PROJECT_ID = 9; + SharedData *sharedDataPrimary = CreateSharedData(SHARER_NAME_PRIMARY, "./shared_file", PROJECT_ID); + SharedData *sharedDataMinor = CreateSharedData(SHARER_NAME_MINOR, "./shared_file", PROJECT_ID); + if (nullptr != sharedDataMinor) { - sharedData->mMakeSharedData(sharedData, sizeof(int), sizeof(int)); - sharedData->mFree(sharedData); + sharedDataMinor->mMakeSharedData(sharedDataMinor, sizeof(int), sizeof(int)); + } + if (nullptr != sharedDataPrimary) + { + int readableData = -1; + sharedDataPrimary->mMakeSharedData(sharedDataPrimary, sizeof(int), sizeof(int)); + sharedDataPrimary->mGetReadableDataPointer(sharedDataPrimary, &readableData, sizeof(int)); + LogInfo("readableData = %d\n", readableData); + sharedDataPrimary->mFree(sharedDataPrimary); + } + if (nullptr != sharedDataMinor) + { + sharedDataMinor->mFree(sharedDataMinor); } ILogUnInit(); } diff --git a/utils/SharedData/include/SharedData.h b/utils/SharedData/include/SharedData.h index d52da37..a97a68f 100644 --- a/utils/SharedData/include/SharedData.h +++ b/utils/SharedData/include/SharedData.h @@ -28,9 +28,9 @@ extern "C" typedef struct shared_data SharedData; typedef struct shared_data { - const StatusCode (*mMakeSharedData)(SharedData *, const int, const int); + const StatusCode (*mMakeSharedData)(SharedData *, const unsigned int, const unsigned int); const StatusCode (*mCleanSharedData)(SharedData *); - void *(*mGetReadableDataPointer)(SharedData *); + void (*mGetReadableDataPointer)(SharedData *, void *, const int); void *(*mGetWritableDataPointer)(SharedData *); void (*mFree)(void *); } SharedData; diff --git a/utils/SharedData/src/SharedDataImpl.cpp b/utils/SharedData/src/SharedDataImpl.cpp index ef36ba8..643ae55 100644 --- a/utils/SharedData/src/SharedDataImpl.cpp +++ b/utils/SharedData/src/SharedDataImpl.cpp @@ -20,40 +20,108 @@ constexpr short THERE_TWO_USER_DATA_HEADER = 2; SharedDataCpp::SharedDataCpp(const SHARER_NAME &sharerName, const char *path, const int &projectId) : SharedMemory(path, projectId), mSharerName(sharerName) { - mReadableSize = 0; - mWritableSize = 0; + mPrimaryReadSize = 0; + mMinorReadSize = 0; mSharedMemeory = nullptr; } -void SharedDataCpp::MakeSharedMemory(const int readableSize, const int writableSize) -{ - mReadableSize = readableSize; - mWritableSize = writableSize; - const int SHARED_MEMORY_SIZE = readableSize + writableSize + sizeof(UserDataHeader) * THERE_TWO_USER_DATA_HEADER; - SharedMemory::MakeSharedMemory(SHARED_MEMORY_SIZE); - mSharedMemeory = SharedMemory::GetMemory(); -} -void *SharedDataCpp::GetReadableMemory(void) +void SharedDataCpp::MakeSharedMemory(const unsigned int readableSize, const unsigned int writableSize) { if (SHARER_NAME_PRIMARY == mSharerName) { - return (char *)mSharedMemeory + sizeof(UserDataHeader); + mPrimaryReadSize = readableSize; + mMinorReadSize = writableSize; + } + else if (SHARER_NAME_MINOR == mSharerName) + { + mPrimaryReadSize = writableSize; + mMinorReadSize = readableSize; + } + else + { + LogError("Make shared memory failed.\n"); + return; + } + const int SHARED_MEMORY_SIZE = readableSize + writableSize + sizeof(UserDataHeader) * THERE_TWO_USER_DATA_HEADER; + SharedMemory::MakeSharedMemory(SHARED_MEMORY_SIZE); + mSharedMemeory = SharedMemory::GetMemory(); + WritableDataInit(); + // if (nullptr != mSharedMemeory) + // { + // UserDataHeader *writableHeader = (UserDataHeader *)((char *)mSharedMemeory + sizeof(UserDataHeader) + mPrimaryReadSize); + // memcpy(writableHeader->mUserName, USER_NAME_INIT_NAME, USER_NAME_BUF_LENGTH); + // } + // else + // { + // LogError("mSharedMemeory get failed.\n"); + // } +} +void SharedDataCpp::WritableDataInit(void) +{ + if (nullptr == mSharedMemeory) + { + LogError("mSharedMemeory is nullptr, failed.\n"); + return; + } + if (SHARER_NAME_PRIMARY == mSharerName) + { + UserDataHeader *writableHeader = (UserDataHeader *)((char *)mSharedMemeory + sizeof(UserDataHeader) + mPrimaryReadSize); + memcpy(writableHeader->mUserName, USER_NAME_INIT_NAME, USER_NAME_BUF_LENGTH); + } + else if (SHARER_NAME_MINOR == mSharerName) + { + UserDataHeader *writableHeader = (UserDataHeader *)((char *)mSharedMemeory); + memcpy(writableHeader->mUserName, USER_NAME_INIT_NAME, USER_NAME_BUF_LENGTH); + } + else + { + LogError("Make shared memory failed.\n"); + return; + } +} +void SharedDataCpp::GetReadableMemory(void *buf, const unsigned int &bufLength) +{ + if (bufLength > mPrimaryReadSize) + { + LogError("Get readable memory failed, buf length too large.\n"); + return; + } + if (SHARER_NAME_PRIMARY == mSharerName) + { + if (memcmp((char *)mSharedMemeory, USER_NAME_INIT_NAME, USER_NAME_BUF_LENGTH) == 0) + { + memcpy(buf, (char *)mSharedMemeory + sizeof(UserDataHeader), bufLength); + } + else + { + LogError("Readable memory didn't init yet.\n"); + } } if (SHARER_NAME_MINOR == mSharerName) { - return (char *)mSharedMemeory + sizeof(UserDataHeader) * THERE_TWO_USER_DATA_HEADER + mReadableSize; + if (memcmp((char *)mSharedMemeory + sizeof(UserDataHeader) + mPrimaryReadSize, + USER_NAME_INIT_NAME, + USER_NAME_BUF_LENGTH) == 0) + { + memcpy(buf, + (char *)mSharedMemeory + sizeof(UserDataHeader) * THERE_TWO_USER_DATA_HEADER + mPrimaryReadSize, + bufLength); + } + else + { + LogError("Readable memory didn't init yet.\n"); + } } - return nullptr; } -static const StatusCode MakeSharedData(SharedData *object, const int readableSize, const int writableSize) +static const StatusCode MakeSharedData(SharedData *object, const unsigned int readableSize, const unsigned int writableSize) { SharedDataImpl *impl = ((SharedDataImpl *)(((char *)object) - sizeof(SharedDataHeader))); impl->mSharedData->MakeSharedMemory(readableSize, writableSize); return CreateStatusCode(STATUS_CODE_OK); } -static void *GetSharedReadableMemory(SharedData *object) +static void GetSharedReadableMemory(SharedData *object, void *buf, const int bufLength) { SharedDataImpl *impl = ((SharedDataImpl *)(((char *)object) - sizeof(SharedDataHeader))); - return impl->mSharedData->GetReadableMemory(); + impl->mSharedData->GetReadableMemory(buf, bufLength); } static void SharedDataImplFree(void *ptr) { diff --git a/utils/SharedData/src/SharedDataImpl.h b/utils/SharedData/src/SharedDataImpl.h index eea3604..817b287 100644 --- a/utils/SharedData/src/SharedDataImpl.h +++ b/utils/SharedData/src/SharedDataImpl.h @@ -17,12 +17,21 @@ #include "SharedData.h" #include "SharedMemory.h" #include +constexpr int USER_NAME_BUF_LENGTH = 4; +#define USER_NAME_INIT_NAME "XING" +enum USER_DATA_INIT +{ + USER_DATA_INIT_SUCCEED = 0, + USER_DATA_INIT_FAILED, + USER_DATA_INIT_END +}; typedef struct shared_data_header { const char *mCheckName; } SharedDataHeader; typedef struct user_data_header { + char mUserName[USER_NAME_BUF_LENGTH]; int mIsInit; } UserDataHeader; class SharedDataCpp : public SharedMemory @@ -30,15 +39,18 @@ class SharedDataCpp : public SharedMemory public: SharedDataCpp(const SHARER_NAME &sharerName, const char *path, const int &projectId); virtual ~SharedDataCpp() = default; - void MakeSharedMemory(const int readableSize, const int writableSize); - void *GetReadableMemory(void); + void MakeSharedMemory(const unsigned int readableSize, const unsigned int writableSize); + void GetReadableMemory(void *buf, const unsigned int &bufLength); + +private: + void WritableDataInit(void); private: const SHARER_NAME mSharerName; // std::shared_ptr mReadableMemory; // std::shared_ptr mWritableMemory; - unsigned int mReadableSize; - unsigned int mWritableSize; + unsigned int mPrimaryReadSize; + unsigned int mMinorReadSize; void *mSharedMemeory; }; typedef struct shared_data_impl SharedDataImpl;