diff --git a/libpurgeablemem/c/src/purgeable_mem_c.c b/libpurgeablemem/c/src/purgeable_mem_c.c index 2c150ca05f8453b4bea873523e16b5c915592908..e1a08fee34d2c2e1301cc682ff7b0f593e6d0253 100644 --- a/libpurgeablemem/c/src/purgeable_mem_c.c +++ b/libpurgeablemem/c/src/purgeable_mem_c.c @@ -72,8 +72,9 @@ static struct PurgMem *PurgMemCreate_(size_t len, struct PurgMemBuilder *builder return NULL; } size_t size = RoundUp(len, PAGE_SIZE); - int type = MAP_ANONYMOUS; - type |= (UxpteIsEnabled() ? MAP_PURGEABLE : MAP_PRIVATE); + unsigned int utype = MAP_ANONYMOUS; + utype |= (UxpteIsEnabled() ? MAP_PURGEABLE : MAP_PRIVATE); + int type = (int) utype; pugObj->dataPtr = mmap(NULL, size, PROT_READ | PROT_WRITE, type, -1, 0); if (pugObj->dataPtr == MAP_FAILED) { PM_HILOG_ERROR_C(LOG_CORE, "%{public}s: mmap dataPtr fail", __func__); diff --git a/libpurgeablemem/common/src/ux_page_table_c.c b/libpurgeablemem/common/src/ux_page_table_c.c index 8fe95defac574dfb0d28df8b69843bdeebf3bc34..7dd5e4cbcdd173010dfce01f0007a45b21c0ad25 100644 --- a/libpurgeablemem/common/src/ux_page_table_c.c +++ b/libpurgeablemem/common/src/ux_page_table_c.c @@ -259,8 +259,13 @@ static inline bool UxpteCAS_(uxpte_t *uxpte, uxpte_t old, uxpte_t newVal) static void UxpteAdd(uxpte_t *pte, size_t incNum) { - uxpte_t old; + uxpte_t old = 0; + uxpte_t newVal = 0; do { + if (old + incNum < old || old + incNum < incNum) { + break; + } + newVal = old + incNum; old = UxpteLoad(pte); if (ULONG_MAX - old < incNum) { return; @@ -269,7 +274,7 @@ static void UxpteAdd(uxpte_t *pte, size_t incNum) sched_yield(); continue; } - } while (!UxpteCAS_(pte, old, old + incNum)); + } while (!UxpteCAS_(pte, old, newVal)); } static void UxpteSub(uxpte_t *pte, size_t decNum)