From f29825a0f8cea1883ea31729788c38692724567e Mon Sep 17 00:00:00 2001 From: zili Date: Fri, 9 Jul 2021 10:12:07 +0800 Subject: [PATCH] add interface to query if running lock is holding Signed-off-by: zili --- frameworks/include/running_lock_entry.h | 5 +++ frameworks/src/running_lock.c | 45 +++++++++++++++++++------ interfaces/kits/running_lock.h | 1 + 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/frameworks/include/running_lock_entry.h b/frameworks/include/running_lock_entry.h index 381a55a..935d3e7 100644 --- a/frameworks/include/running_lock_entry.h +++ b/frameworks/include/running_lock_entry.h @@ -29,9 +29,14 @@ typedef struct { uint64_t token; } RunningLockIdentity; +typedef struct { + BOOL isHolding; +} RunningLockStatus; + typedef struct { RunningLock lock; RunningLockIdentity identity; + RunningLockStatus status; } RunningLockEntry; static inline RunningLockEntry *GetRunningLockEntry(const RunningLock *lock) diff --git a/frameworks/src/running_lock.c b/frameworks/src/running_lock.c index 348c5a0..2895c67 100644 --- a/frameworks/src/running_lock.c +++ b/frameworks/src/running_lock.c @@ -94,7 +94,7 @@ static RunningLockEntry *CreateRunningLockEntry(const char *name, RunningLockTyp return entry; } -static void DestroyRunningLockEntry(RunningLockEntry *entry) +static inline void DestroyRunningLockEntry(RunningLockEntry *entry) { if (entry != NULL) { POWER_HILOGD("Free entry: %p", entry); @@ -119,31 +119,54 @@ const RunningLock *CreateRunningLock(const char *name, RunningLockType type, Run return &entry->lock; } -void DestroyRunningLock(const RunningLock *lock) +BOOL AcquireRunningLock(const RunningLock *lock) { - if (lock == NULL) { - POWER_HILOGE("Invalid running lock"); - return; + if (IsRunningLockExisted(lock) == FALSE) { + POWER_HILOGE("Non-existent running lock: %s", lock->name); + return FALSE; } - if (RemoveRunningLock(lock) == TRUE) { - DestroyRunningLockEntry(GetRunningLockEntry(lock)); + RunningLockEntry *entry = GetRunningLockEntry(lock); + if (entry->status.isHolding == TRUE) { + POWER_HILOGI("Already acquired, name: %s", lock->name); + return TRUE; } + entry->status.isHolding = AcquireRunningLockEntry(entry, -1); + return entry->status.isHolding; } -BOOL AcquireRunningLock(const RunningLock *lock) +BOOL ReleaseRunningLock(const RunningLock *lock) { if (IsRunningLockExisted(lock) == FALSE) { POWER_HILOGE("Non-existent running lock: %s", lock->name); return FALSE; } - return AcquireRunningLockEntry(GetRunningLockEntry(lock), -1); + RunningLockEntry *entry = GetRunningLockEntry(lock); + if (entry->status.isHolding == FALSE) { + POWER_HILOGI("Already released, name: %s", lock->name); + return TRUE; + } + entry->status.isHolding = !ReleaseRunningLockEntry(entry); + return !entry->status.isHolding; } -BOOL ReleaseRunningLock(const RunningLock *lock) +void DestroyRunningLock(const RunningLock *lock) +{ + if (lock == NULL) { + POWER_HILOGE("Invalid running lock"); + return; + } + ReleaseRunningLock(lock); + if (RemoveRunningLock(lock) == TRUE) { + DestroyRunningLockEntry(GetRunningLockEntry(lock)); + } +} + +BOOL IsRunningLockHolding(const RunningLock *lock) { if (IsRunningLockExisted(lock) == FALSE) { POWER_HILOGE("Non-existent running lock: %s", lock->name); return FALSE; } - return ReleaseRunningLockEntry(GetRunningLockEntry(lock)); + RunningLockEntry *entry = GetRunningLockEntry(lock); + return entry->status.isHolding; } diff --git a/interfaces/kits/running_lock.h b/interfaces/kits/running_lock.h index 2868dc5..742dc00 100644 --- a/interfaces/kits/running_lock.h +++ b/interfaces/kits/running_lock.h @@ -61,6 +61,7 @@ const RunningLock *CreateRunningLock(const char *name, RunningLockType type, Run void DestroyRunningLock(const RunningLock *lock); BOOL AcquireRunningLock(const RunningLock *lock); BOOL ReleaseRunningLock(const RunningLock *lock); +BOOL IsRunningLockHolding(const RunningLock *lock); #ifdef __cplusplus } -- Gitee