diff --git a/libpurgeablemem/BUILD.gn b/libpurgeablemem/BUILD.gn index 38bdf253084dbc7ebe841ac405591b5713002c4f..2917c76672a5801ff8d95048a1171d1621605f9a 100644 --- a/libpurgeablemem/BUILD.gn +++ b/libpurgeablemem/BUILD.gn @@ -26,6 +26,7 @@ ohos_shared_library("libpurgeablemem") { sources = [ "c/src/purgeable_mem_builder_c.c", "c/src/purgeable_mem_c.c", + "common/src/pm_state_c.c", "common/src/ux_page_table_c.c", "cpp/src/purgeable_mem.cpp", "cpp/src/purgeable_mem_builder.cpp", diff --git a/libpurgeablemem/c/src/purgeable_mem_c.c b/libpurgeablemem/c/src/purgeable_mem_c.c index 03dedea1bb0356dbdd957ee8b68a5499400dd146..3d1d0d771375a968dd80edd5bb269386489d22f9 100644 --- a/libpurgeablemem/c/src/purgeable_mem_c.c +++ b/libpurgeablemem/c/src/purgeable_mem_c.c @@ -82,7 +82,7 @@ static struct PurgMem *PurgMemCreate_(size_t len, struct PurgMemBuilder *builder } PMState err = InitUxPageTable(pugObj->uxPageTable, (uint64_t)(pugObj->dataPtr), size); /* dataPtr is aligned */ if (err != PM_OK) { - HILOG_ERROR(LOG_CORE, "%{public}s: InitUxPageTable fail, %{public}s", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: InitUxPageTable fail, %{public}s", __func__, GetPMStateName(err)); goto free_uxpt; } int lockInitRet = pthread_rwlock_init(&(pugObj->rwlock), NULL); @@ -179,7 +179,7 @@ bool PurgMemDestroy(struct PurgMem *purgObj) if (purgObj->uxPageTable) { PMState deinitRet = DeinitUxPageTable(purgObj->uxPageTable); if (deinitRet != PM_OK) { - HILOG_ERROR(LOG_CORE, "%{public}s: deinit upt fail, %{public}s", __func__, PMStateNames[deinitRet]); + HILOG_ERROR(LOG_CORE, "%{public}s: deinit upt fail, %{public}s", __func__, GetPMStateName(deinitRet)); err = deinitRet; } else { free(purgObj->uxPageTable); @@ -193,7 +193,7 @@ bool PurgMemDestroy(struct PurgMem *purgObj) HILOG_ERROR(LOG_CORE, "%{public}s: succ", __func__); return true; } - HILOG_ERROR(LOG_CORE, "%{public}s: fail, %{public}s", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: fail, %{public}s", __func__, GetPMStateName(err)); return false; } @@ -296,7 +296,7 @@ bool PurgMemBeginRead(struct PurgMem *purgObj) } if (!ret) { - HILOG_ERROR(LOG_CORE, "%{public}s: %{public}s, UxptePut.", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: %{public}s, UxptePut.", __func__, GetPMStateName(err)); UxptePut(purgObj->uxPageTable, (uint64_t)(purgObj->dataPtr), purgObj->dataSizeInput); } return ret; @@ -341,7 +341,7 @@ bool PurgMemBeginWrite(struct PurgMem *purgObj) } uxpte_put: - HILOG_ERROR(LOG_CORE, "%{public}s: %{public}s, return false, UxptePut.", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: %{public}s, return false, UxptePut.", __func__, GetPMStateName(err)); UxptePut(purgObj->uxPageTable, (uint64_t)(purgObj->dataPtr), purgObj->dataSizeInput); return false; succ: diff --git a/libpurgeablemem/common/include/pm_state_c.h b/libpurgeablemem/common/include/pm_state_c.h index 07ecd707c01746d8454e8fc6a066ffea9326e3d1..90b205771d1ddfb80b98ca4a6b320dea82168534 100644 --- a/libpurgeablemem/common/include/pm_state_c.h +++ b/libpurgeablemem/common/include/pm_state_c.h @@ -22,6 +22,10 @@ extern "C" { #endif /* End of #if __cplusplus */ #endif /* End of #ifdef __cplusplus */ +/* + * PMState: Inner state. + * It may be used in C or CPP code, so using "typedef enum" for common cases. + */ typedef enum { PM_OK = 0, PM_BUILDER_NULL, @@ -47,29 +51,12 @@ typedef enum { PM_ERR_TYPES, } PMState; /* purgeable mem errno */ -static const char * const PMStateNames[PM_ERR_TYPES] = { - "OK", - "BuilderPtrNULL", - "MmapPurgMemFail", - "MmapUxptFail", - "UnmapPurgMemSucc", - "UnmapPurgMemFail", - "UnmapUxptFail", - "UxpteOutOfRange", - "UxptePresentDataPurged", - "UxpteNoPresent", - "LockInitFail", - "ReadLockSucc", - "ReadLockFail", - "WriteLockFail", - "ReadUnlockFail", - "WriteUnlockFail", - "DataPurged", - "DataNoPurged", - "BuilderBuildAllSucc", - "BuilderBuildAllFail", - "BuilderDestoryFailed", -}; +/* + * PMStateName: Inner func, get name of PMState @state. + * Input: @state: PMState. + * Return: the name of PMState @state. + */ +const char *GetPMStateName(PMState state); #ifdef __cplusplus #if __cplusplus diff --git a/libpurgeablemem/common/include/pm_util.h b/libpurgeablemem/common/include/pm_util.h index e0fcf015e1207306641ac36205948e13e246f945..d2bb77524cd29a62f740527c20dfb4f860656e42 100644 --- a/libpurgeablemem/common/include/pm_util.h +++ b/libpurgeablemem/common/include/pm_util.h @@ -44,7 +44,6 @@ extern "C" { #if (USE_UXPT == false) #undef MAP_PURGEABLE #define MAP_PURGEABLE 0x0 - #undef MAP_USEREXPTE #define MAP_USEREXPTE 0x0 #endif diff --git a/libpurgeablemem/common/src/pm_state_c.c b/libpurgeablemem/common/src/pm_state_c.c new file mode 100644 index 0000000000000000000000000000000000000000..7c57fc938fc34a6ffa38a9c539e4ca20708b7db5 --- /dev/null +++ b/libpurgeablemem/common/src/pm_state_c.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "pm_state_c.h" + +#undef LOG_TAG +#define LOG_TAG "PurgeableMemC: state" + +static const char * const PMStateNames[PM_ERR_TYPES] = { + "OK", + "BuilderPtrNULL", + "MmapPurgMemFail", + "MmapUxptFail", + "UnmapPurgMemSucc", + "UnmapPurgMemFail", + "UnmapUxptFail", + "UxpteOutOfRange", + "UxptePresentDataPurged", + "UxpteNoPresent", + "LockInitFail", + "ReadLockSucc", + "ReadLockFail", + "WriteLockFail", + "ReadUnlockFail", + "WriteUnlockFail", + "DataPurged", + "DataNoPurged", + "BuilderBuildAllSucc", + "BuilderBuildAllFail", + "BuilderDestoryFailed", +}; + +const char *GetPMStateName(PMState state) +{ + if (state < 0 || state >= PM_ERR_TYPES) { + return "NONE"; + } + return PMStateNames[state]; +} diff --git a/libpurgeablemem/cpp/src/purgeable_mem.cpp b/libpurgeablemem/cpp/src/purgeable_mem.cpp index 9100bb6163c46891d95573943a901ad137c3e110..e1c10aca5a6003cffb1ec49dc05e8ee567498003 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem.cpp @@ -53,7 +53,7 @@ PurgeableMem::PurgeableMem(size_t dataSize, std::unique_ptr buildDataCount_ = 0; if (builder) { - builder_ = move(builder); + builder_ = std::move(builder); } MAKE_UNIQUE(pageTable_, UxPageTable, "constructor uxpt make_unique fail", return, (uint64_t)dataPtr_, size); HILOG_DEBUG(LOG_CORE, "%{public}s init succ. %{public}s", __func__, ToString_().c_str()); @@ -120,7 +120,7 @@ bool PurgeableMem::BeginRead() } if (!ret) { - HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut.", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut.", __func__, GetPMStateName(err)); pageTable_->PutUxpte((uint64_t)dataPtr_, dataSizeInput_); } return ret; @@ -167,7 +167,7 @@ bool PurgeableMem::BeginWrite() } rwlock_.unlock(); - HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut.", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut.", __func__, GetPMStateName(err)); pageTable_->PutUxpte((uint64_t)dataPtr_, dataSizeInput_); return false; } @@ -200,9 +200,9 @@ bool PurgeableMem::ModifyContentByBuilder(std::unique_ptr m } /* log modify */ if (builder_) { - builder_->AppendBuilder(move(modifier)); + builder_->AppendBuilder(std::move(modifier)); } else { - builder_ = move(modifier); + builder_ = std::move(modifier); } return true; } diff --git a/libpurgeablemem/cpp/src/purgeable_mem_builder.cpp b/libpurgeablemem/cpp/src/purgeable_mem_builder.cpp index 4d7d6ff34d01acbba62bd6dc54539bbbb099c6be..70b8df53f2403a720cb82f4cee670678e886f288 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem_builder.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem_builder.cpp @@ -34,9 +34,9 @@ void PurgeableMemBuilder::AppendBuilder(std::unique_ptr bui { IF_NULL_LOG_ACTION(builder, "input builder is nullptr", return); if (nextBuilder_) { - nextBuilder_->AppendBuilder(move(builder)); + nextBuilder_->AppendBuilder(std::move(builder)); } else { - nextBuilder_ = move(builder); + nextBuilder_ = std::move(builder); } } diff --git a/libpurgeablemem/cpp/src/ux_page_table.cpp b/libpurgeablemem/cpp/src/ux_page_table.cpp index 17f92e0f7a0f713a3dd9fc917813c0f045a2f6ff..fe4d03dd36b9c070fb07bc8970c01f8f9083bc0d 100644 --- a/libpurgeablemem/cpp/src/ux_page_table.cpp +++ b/libpurgeablemem/cpp/src/ux_page_table.cpp @@ -33,7 +33,7 @@ UxPageTable::UxPageTable(uint64_t addr, size_t len) } PMState err = InitUxPageTable(uxpt_, addr, len); /* dataPtr is aligned */ if (err != PM_OK) { - HILOG_ERROR(LOG_CORE, "%{public}s: InitUxPageTable fail, %{public}s", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: InitUxPageTable fail, %{public}s", __func__, GetPMStateName(err)); free(uxpt_); uxpt_ = nullptr; } @@ -45,7 +45,7 @@ UxPageTable::~UxPageTable() if (uxpt_) { PMState err = DeinitUxPageTable(uxpt_); if (err != PM_OK) { - HILOG_ERROR(LOG_CORE, "%{public}s: deinit upt fail, %{public}s", __func__, PMStateNames[err]); + HILOG_ERROR(LOG_CORE, "%{public}s: deinit upt fail, %{public}s", __func__, GetPMStateName(err)); } else { free(uxpt_); uxpt_ = nullptr; diff --git a/libpurgeablemem/test/purgeable_cpp_test.cpp b/libpurgeablemem/test/purgeable_cpp_test.cpp index cae1dfd6eda8a2b7a2237aa33ac569ab50cf3a2f..eb45d9a37c5f89f9977f9776e1b72fab095e3b63 100644 --- a/libpurgeablemem/test/purgeable_cpp_test.cpp +++ b/libpurgeablemem/test/purgeable_cpp_test.cpp @@ -122,18 +122,18 @@ HWTEST_F(PurgeableCppTest, MultiObjCreateTest, TestSize.Level1) const char alphabetFinal[] = "BBCDEFGHIJKLMNOPQRSTUVWXYZ\0"; std::unique_ptr builder = std::make_unique('A', 'Z'); std::unique_ptr builder2 = std::make_unique('A', 'Z'); - PurgeableMem pobj1(27, move(builder)); + PurgeableMem pobj1(27, std::move(builder)); std::unique_ptr mod = std::make_unique('A', 'B'); std::unique_ptr mod2 = std::make_unique('A', 'B'); LoopPrintAlphabet(&pobj1, 1); - ModifyPurgMemByBuilder(&pobj1, move(mod)); + ModifyPurgMemByBuilder(&pobj1, std::move(mod)); LoopPrintAlphabet(&pobj1, 1); LoopReclaimPurgeable(1); - PurgeableMem pobj2(27, move(builder2)); + PurgeableMem pobj2(27, std::move(builder2)); LoopPrintAlphabet(&pobj2, 1); - ModifyPurgMemByBuilder(&pobj2, move(mod2)); + ModifyPurgMemByBuilder(&pobj2, std::move(mod2)); LoopPrintAlphabet(&pobj2, 1); if (pobj1.BeginRead()) { @@ -156,7 +156,7 @@ HWTEST_F(PurgeableCppTest, ReadTest, TestSize.Level1) const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\0"; PurgeableMem *pobj = new PurgeableMem(27); std::unique_ptr builder = std::make_unique('A', 'Z'); - ModifyPurgMemByBuilder(pobj, move(builder)); + ModifyPurgMemByBuilder(pobj, std::move(builder)); std::thread reclaimThread(LoopReclaimPurgeable, (unsigned int)(-1)); pthread_t reclaimPid = reclaimThread.native_handle(); reclaimThread.detach(); @@ -181,15 +181,15 @@ HWTEST_F(PurgeableCppTest, WriteTest, TestSize.Level1) { const char alphabet[] = "CCCDEFGHIJKLMNOPQRSTUVWXYZ\0"; std::unique_ptr builder = std::make_unique('A', 'Z'); - PurgeableMem *pobj = new PurgeableMem(27, move(builder)); + PurgeableMem *pobj = new PurgeableMem(27, std::move(builder)); std::thread reclaimThread(LoopReclaimPurgeable, (unsigned int)(-1)); pthread_t reclaimPid = reclaimThread.native_handle(); reclaimThread.detach(); std::unique_ptr modA2B = std::make_unique('A', 'B'); std::unique_ptr modB2C = std::make_unique('B', 'C'); - ModifyPurgMemByBuilder(pobj, move(modA2B)); - ModifyPurgMemByBuilder(pobj, move(modB2C)); + ModifyPurgMemByBuilder(pobj, std::move(modA2B)); + ModifyPurgMemByBuilder(pobj, std::move(modB2C)); if (pobj->BeginRead()) { ASSERT_STREQ(alphabet, (char *)(pobj->GetContent())); @@ -208,7 +208,7 @@ HWTEST_F(PurgeableCppTest, ReadWriteTest, TestSize.Level1) { const char alphabet[] = "DDDDEFGHIJKLMNOPQRSTUVWXYZ\0"; std::unique_ptr builder = std::make_unique('A', 'Z'); - PurgeableMem *pobj = new PurgeableMem(27, move(builder)); + PurgeableMem *pobj = new PurgeableMem(27, std::move(builder)); /* loop reclaim thread */ std::thread reclaimThread(LoopReclaimPurgeable, (unsigned int)(-1)); pthread_t reclaimPid = reclaimThread.native_handle(); @@ -221,9 +221,9 @@ HWTEST_F(PurgeableCppTest, ReadWriteTest, TestSize.Level1) std::unique_ptr modA2B = std::make_unique('A', 'B'); std::unique_ptr modB2C = std::make_unique('B', 'C'); std::unique_ptr modC2D = std::make_unique('C', 'D'); - ModifyPurgMemByBuilder(pobj, move(modA2B)); - ModifyPurgMemByBuilder(pobj, move(modB2C)); - ModifyPurgMemByBuilder(pobj, move(modC2D)); + ModifyPurgMemByBuilder(pobj, std::move(modA2B)); + ModifyPurgMemByBuilder(pobj, std::move(modB2C)); + ModifyPurgMemByBuilder(pobj, std::move(modC2D)); if (pobj->BeginRead()) { ASSERT_STREQ(alphabet, (char *)(pobj->GetContent())); @@ -294,7 +294,7 @@ void ModifyPurgMemByBuilder(PurgeableMem *pdata, std::unique_ptrGetContent()) << "]" << std::endl; - pdata->ModifyContentByBuilder(move(mod)); + pdata->ModifyContentByBuilder(std::move(mod)); std::cout<< __func__ << " after mod data=[" << (char *)(pdata->GetContent()) << "]" << std::endl; std::cout << __func__ << " data=[" << (char *)(pdata->GetContent()) << "]" << std::endl;