diff --git a/test/utils/SharedData/src/SharedDataTest.cpp b/test/utils/SharedData/src/SharedDataTest.cpp index f986684..f0a8c57 100644 --- a/test/utils/SharedData/src/SharedDataTest.cpp +++ b/test/utils/SharedData/src/SharedDataTest.cpp @@ -28,13 +28,15 @@ namespace SharedDataTest SharedData *sharedDataMinor = CreateSharedData(SHARER_NAME_MINOR, "./shared_file", PROJECT_ID); if (nullptr != sharedDataMinor) { + int writableData = 99; sharedDataMinor->mMakeSharedData(sharedDataMinor, sizeof(int), sizeof(int)); + sharedDataMinor->mSetWritableData(sharedDataMinor, &writableData, sizeof(int)); } if (nullptr != sharedDataPrimary) { int readableData = -1; sharedDataPrimary->mMakeSharedData(sharedDataPrimary, sizeof(int), sizeof(int)); - sharedDataPrimary->mGetReadableDataPointer(sharedDataPrimary, &readableData, sizeof(int)); + sharedDataPrimary->mGetReadableData(sharedDataPrimary, &readableData, sizeof(int)); LogInfo("readableData = %d\n", readableData); sharedDataPrimary->mFree(sharedDataPrimary); } @@ -44,4 +46,32 @@ namespace SharedDataTest } ILogUnInit(); } + // ../output_files/test/bin/SharedDataTest --gtest_filter=SharedDataTest.Demo2 + TEST(SharedDataTest, Demo2) + { + CreateLogModule(); + ILogInit(LOG_INSTANCE_TYPE_END); + 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) + { + int writableData = 9; + IMakeSharedData(sharedDataMinor, sizeof(int), sizeof(int)); + ISetWritableData(sharedDataMinor, &writableData, sizeof(int)); + } + if (nullptr != sharedDataPrimary) + { + int readableData = -1; + IMakeSharedData(sharedDataPrimary, sizeof(int), sizeof(int)); + IGetReadableData(sharedDataPrimary, &readableData, sizeof(int)); + LogInfo("readableData = %d\n", readableData); + IFree(sharedDataPrimary); + } + if (nullptr != sharedDataMinor) + { + IFree(sharedDataMinor); + } + ILogUnInit(); + } } // namespace SharedDataTest \ No newline at end of file diff --git a/utils/SharedData/include/SharedData.h b/utils/SharedData/include/SharedData.h index a97a68f..41217d8 100644 --- a/utils/SharedData/include/SharedData.h +++ b/utils/SharedData/include/SharedData.h @@ -30,11 +30,33 @@ extern "C" { const StatusCode (*mMakeSharedData)(SharedData *, const unsigned int, const unsigned int); const StatusCode (*mCleanSharedData)(SharedData *); - void (*mGetReadableDataPointer)(SharedData *, void *, const int); - void *(*mGetWritableDataPointer)(SharedData *); + void (*mGetReadableData)(SharedData *, void *, const unsigned int); + void (*mSetWritableData)(SharedData *, void *, const unsigned int); void (*mFree)(void *); } SharedData; SharedData *CreateSharedData(const SHARER_NAME name, const char *path, const int projectId); + static inline const StatusCode IMakeSharedData(SharedData *object, + const unsigned int readableSize, + const unsigned int writableSize) + { + return object->mMakeSharedData(object, readableSize, writableSize); + } + static inline const StatusCode ICleanSharedData(SharedData *object) + { + return object->mCleanSharedData(object); + } + static inline void IGetReadableData(SharedData *object, void *buf, const unsigned int &bufLength) + { + object->mGetReadableData(object, buf, bufLength); + } + static inline void ISetWritableData(SharedData *object, void *buf, const unsigned int &bufLength) + { + object->mSetWritableData(object, buf, bufLength); + } + static inline void IFree(void *ptr) + { + ((SharedData *)ptr)->mFree(ptr); + } #ifdef __cplusplus } #endif diff --git a/utils/SharedData/src/SharedDataImpl.cpp b/utils/SharedData/src/SharedDataImpl.cpp index 643ae55..744813e 100644 --- a/utils/SharedData/src/SharedDataImpl.cpp +++ b/utils/SharedData/src/SharedDataImpl.cpp @@ -45,15 +45,6 @@ void SharedDataCpp::MakeSharedMemory(const unsigned int readableSize, const unsi 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) { @@ -80,12 +71,7 @@ void SharedDataCpp::WritableDataInit(void) } 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 (SHARER_NAME_PRIMARY == mSharerName && bufLength == mPrimaryReadSize) { if (memcmp((char *)mSharedMemeory, USER_NAME_INIT_NAME, USER_NAME_BUF_LENGTH) == 0) { @@ -96,7 +82,7 @@ void SharedDataCpp::GetReadableMemory(void *buf, const unsigned int &bufLength) LogError("Readable memory didn't init yet.\n"); } } - if (SHARER_NAME_MINOR == mSharerName) + else if (SHARER_NAME_MINOR == mSharerName && bufLength == mMinorReadSize) { if (memcmp((char *)mSharedMemeory + sizeof(UserDataHeader) + mPrimaryReadSize, USER_NAME_INIT_NAME, @@ -111,6 +97,27 @@ void SharedDataCpp::GetReadableMemory(void *buf, const unsigned int &bufLength) LogError("Readable memory didn't init yet.\n"); } } + else + { + LogError("Get readable memory failed.\n"); + } +} +void SharedDataCpp::SetWritableMemory(void *buf, const unsigned int &bufLength) +{ + if (SHARER_NAME_PRIMARY == mSharerName && bufLength == mMinorReadSize) + { + memcpy((char *)mSharedMemeory + sizeof(UserDataHeader) * THERE_TWO_USER_DATA_HEADER + mPrimaryReadSize, + buf, + bufLength); + } + else if (SHARER_NAME_MINOR == mSharerName && bufLength == mPrimaryReadSize) + { + memcpy((char *)mSharedMemeory + sizeof(UserDataHeader), buf, bufLength); + } + else + { + LogError("Set writable memory failed.\n"); + } } static const StatusCode MakeSharedData(SharedData *object, const unsigned int readableSize, const unsigned int writableSize) { @@ -118,11 +125,16 @@ static const StatusCode MakeSharedData(SharedData *object, const unsigned int re impl->mSharedData->MakeSharedMemory(readableSize, writableSize); return CreateStatusCode(STATUS_CODE_OK); } -static void GetSharedReadableMemory(SharedData *object, void *buf, const int bufLength) +static void GetSharedReadableMemory(SharedData *object, void *buf, const unsigned int bufLength) { SharedDataImpl *impl = ((SharedDataImpl *)(((char *)object) - sizeof(SharedDataHeader))); impl->mSharedData->GetReadableMemory(buf, bufLength); } +static void SetSharedWritableMemory(SharedData *object, void *buf, const unsigned int bufLength) +{ + SharedDataImpl *impl = ((SharedDataImpl *)(((char *)object) - sizeof(SharedDataHeader))); + impl->mSharedData->SetWritableMemory(buf, bufLength); +} static void SharedDataImplFree(void *ptr) { SharedDataImpl *object = ((SharedDataImpl *)(((char *)ptr) - sizeof(SharedDataHeader))); @@ -143,7 +155,8 @@ SharedData *NewSharedDataImpl(const SHARER_NAME &name, const char *path, const i memcpy((void *)impl, (void *)&tmp, sizeof(SharedDataImpl)); impl->mHeader.mCheckName = SHARED_DATA_NAME; impl->mBase.mMakeSharedData = MakeSharedData; - impl->mBase.mGetReadableDataPointer = GetSharedReadableMemory; + impl->mBase.mGetReadableData = GetSharedReadableMemory; + impl->mBase.mSetWritableData = SetSharedWritableMemory; impl->mBase.mFree = SharedDataImplFree; impl->mSharedData = std::make_shared(name, path, projectId); return (SharedData *)(((char *)impl) + sizeof(SharedDataHeader)); diff --git a/utils/SharedData/src/SharedDataImpl.h b/utils/SharedData/src/SharedDataImpl.h index 817b287..9caa658 100644 --- a/utils/SharedData/src/SharedDataImpl.h +++ b/utils/SharedData/src/SharedDataImpl.h @@ -41,6 +41,7 @@ public: virtual ~SharedDataCpp() = default; void MakeSharedMemory(const unsigned int readableSize, const unsigned int writableSize); void GetReadableMemory(void *buf, const unsigned int &bufLength); + void SetWritableMemory(void *buf, const unsigned int &bufLength); private: void WritableDataInit(void);