This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch hotfix/atomic-ref-count in repository https://gitbox.apache.org/repos/asf/celix.git
commit 45320b6836a80d8f25afe01ca0aae3eeab08718c Author: PengZheng <[email protected]> AuthorDate: Wed Sep 20 16:37:48 2023 +0800 Refactor scheduled event use count to use celix_ref. --- libs/framework/src/celix_scheduled_event.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/libs/framework/src/celix_scheduled_event.c b/libs/framework/src/celix_scheduled_event.c index b63dadf7..e941f194 100644 --- a/libs/framework/src/celix_scheduled_event.c +++ b/libs/framework/src/celix_scheduled_event.c @@ -22,6 +22,7 @@ #include <assert.h> #include "celix_constants.h" +#include "celix_ref.h" #include "celix_utils.h" /** @@ -44,6 +45,7 @@ static const char* const CELIX_SCHEDULED_EVENT_DEFAULT_NAME = "unnamed"; * @see celix_bundleContext_wakeupScheduledEvent */ struct celix_scheduled_event { + struct celix_ref useCount; /**< The use count of the scheduled event. */ long scheduledEventId; /**< The ID of the scheduled event. */ celix_framework_logger_t* logger; /**< The framework logger used to log information */ long bndId; /**< The bundle id for the bundle that owns the scheduled event. */ @@ -62,7 +64,6 @@ struct celix_scheduled_event { celix_thread_mutex_t mutex; /**< The mutex to protect the data below. */ celix_thread_cond_t cond; /**< The condition variable to signal the scheduled event for a changed callCount and isRemoved. */ - size_t useCount; /**< The use count of the scheduled event. */ size_t callCount; /**< The call count of the scheduled event. */ bool isMarkedForRemoval; /**< Whether the scheduled event is marked for removal. */ bool isRemoved; /**< Whether the scheduled event is removed. */ @@ -110,7 +111,7 @@ celix_scheduled_event_t* celix_scheduledEvent_create(celix_framework_t* fw, event->removedCallbackData = removedCallbackData; event->removedCallback = removedCallback; event->isMarkedForRemoval = false; - event->useCount = 1; + celix_ref_init(&event->useCount); event->callCount = 0; event->isRemoved = false; event->nextDeadline = celixThreadCondition_getDelayedTime(event->initialDelayInSeconds); @@ -136,9 +137,7 @@ celix_scheduled_event_t* celix_scheduledEvent_retain(celix_scheduled_event_t* ev return NULL; } - celixThreadMutex_lock(&event->mutex); - event->useCount += 1; - celixThreadMutex_unlock(&event->mutex); + celix_ref_get(&event->useCount); return event; } @@ -146,15 +145,7 @@ void celix_scheduledEvent_release(celix_scheduled_event_t* event) { if (event == NULL) { return; } - - celixThreadMutex_lock(&event->mutex); - event->useCount -= 1; - bool unused = event->useCount == 0; - celixThreadMutex_unlock(&event->mutex); - - if (unused) { - celix_scheduledEvent_destroy(event); - } + celix_ref_put(&event->useCount, (bool (*)(struct celix_ref *))celix_scheduledEvent_destroy); } const char* celix_scheduledEvent_getName(const celix_scheduled_event_t* event) { return event->eventName; }
