From f0c57cde025996fb722ee250a794b5bd43b8ccd6 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Wed, 3 Nov 2021 11:25:02 +0800 Subject: [PATCH] [mpp_lock]: Add gcc atomic macro define Change-Id: I3e94cc7be9a51f5d674a132c0a2e6f7afba61d34 Signed-off-by: Herman Chen --- mpp/base/mpp_buffer_impl.cpp | 7 ++++--- mpp/base/mpp_cluster.cpp | 15 ++++++++------- mpp/base/mpp_meta.cpp | 22 +++++++++++----------- osal/inc/mpp_lock.h | 21 +++++++++++++++++++++ osal/mpp_lock.cpp | 10 ++++------ utils/mpi_dec_utils.c | 3 ++- 6 files changed, 50 insertions(+), 28 deletions(-) diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index 7aec23fd..eaeaa48d 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -21,6 +21,7 @@ #include "mpp_log.h" #include "mpp_env.h" #include "mpp_hash.h" +#include "mpp_lock.h" #include "mpp_mem_pool.h" #include "mpp_buffer_impl.h" @@ -694,20 +695,20 @@ void mpp_buffer_service_dump(const char *info) void MppBufferService::inc_total(RK_U32 size) { - RK_U32 total = __sync_add_and_fetch(&total_size, size); + RK_U32 total = MPP_ADD_FETCH(&total_size, size); bool ret; do { RK_U32 old_max = total_max; RK_U32 new_max = MPP_MAX(total, old_max); - ret = __sync_bool_compare_and_swap(&total_max, old_max, new_max); + ret = MPP_BOOL_CAS(&total_max, old_max, new_max); } while (!ret); } void MppBufferService::dec_total(RK_U32 size) { - __sync_fetch_and_sub(&total_size, size); + MPP_FETCH_SUB(&total_size, size); } RK_U32 mpp_buffer_total_now() diff --git a/mpp/base/mpp_cluster.cpp b/mpp/base/mpp_cluster.cpp index b98dc89b..a8fe55b4 100644 --- a/mpp/base/mpp_cluster.cpp +++ b/mpp/base/mpp_cluster.cpp @@ -21,6 +21,7 @@ #include "mpp_log.h" #include "mpp_mem.h" #include "mpp_env.h" +#include "mpp_lock.h" #include "mpp_time.h" #include "mpp_cluster.h" @@ -256,7 +257,7 @@ MPP_RET mpp_node_task_schedule_f(const char *caller, MppNodeTask *task) cluster_dbg_flow("%s sched task %x unknow state %x\n", node_name, old_st); } - ret = __sync_bool_compare_and_swap(&node->state, old_st, new_st); + ret = MPP_BOOL_CAS(&node->state, old_st, new_st); cluster_dbg_flow("%s sched task %x -> %x cas ret %d act %d\n", node_name, old_st, new_st, ret, action); } while (!ret); @@ -294,7 +295,7 @@ MPP_RET mpp_node_task_detach(MppNodeTask *task) const char *node_name = task->node_name; MppNodeProc *proc = task->proc; - __sync_fetch_and_and(&node->state, ~NODE_VALID); + MPP_FETCH_AND(&node->state, ~NODE_VALID); mpp_node_task_schedule(task); @@ -431,7 +432,7 @@ RK_S32 cluster_worker_get_task(ClusterWorker *p) new_st = old_st ^ (NODE_WAIT | NODE_RUN); mpp_assert(old_st & NODE_WAIT); - ret = __sync_bool_compare_and_swap(&node->state, old_st, new_st); + ret = MPP_BOOL_CAS(&node->state, old_st, new_st); } while (!ret); list_add_tail(&task->list_sched, &p->list_task); @@ -503,7 +504,7 @@ static void cluster_worker_run_task(ClusterWorker *p) old_st = state; // NOTE: clear NODE_RUN and NODE_SIGNAL, set NODE_WAIT new_st = old_st ^ (NODE_SIGNAL | NODE_WAIT | NODE_RUN); - cas_ret = __sync_bool_compare_and_swap(&node->state, old_st, new_st); + cas_ret = MPP_BOOL_CAS(&node->state, old_st, new_st); } while (!cas_ret); cluster_dbg_flow("%s run state %x -> %x signal -> wait\n", p->name, old_st, new_st); @@ -518,7 +519,7 @@ static void cluster_worker_run_task(ClusterWorker *p) old_st = node->state; new_st = old_st ^ (NODE_IDLE | NODE_RUN); - cas_ret = __sync_bool_compare_and_swap(&node->state, old_st, new_st); + cas_ret = MPP_BOOL_CAS(&node->state, old_st, new_st); } while (!cas_ret); mpp_assert(node->state & NODE_IDLE); mpp_assert(!(node->state & NODE_RUN)); @@ -707,13 +708,13 @@ MPP_RET mpp_node_attach(MppNode node, MppClientType type) mpp_assert(priority < MAX_PRIORITY); mpp_assert(p); - impl->node_id = __sync_fetch_and_add(&p->node_id, 1); + impl->node_id = MPP_FETCH_ADD(&p->node_id, 1); snprintf(impl->name, sizeof(impl->name) - 1, "%s:%d", p->name, impl->node_id); mpp_node_task_attach(&impl->task, impl, queue, &impl->work); - __sync_fetch_and_add(&p->node_count, 1); + MPP_FETCH_ADD(&p->node_count, 1); cluster_dbg_flow("%s:%d attached %d\n", p->name, impl->node_id, p->node_count); diff --git a/mpp/base/mpp_meta.cpp b/mpp/base/mpp_meta.cpp index 5ef508a3..fc21b775 100644 --- a/mpp/base/mpp_meta.cpp +++ b/mpp/base/mpp_meta.cpp @@ -148,7 +148,7 @@ MppMetaImpl *MppMetaService::get_meta(const char *tag, const char *caller) strncpy(impl->tag, tag_src, sizeof(impl->tag)); impl->caller = caller; - impl->meta_id = __sync_fetch_and_add(&meta_id, 1); + impl->meta_id = MPP_FETCH_ADD(&meta_id, 1); INIT_LIST_HEAD(&impl->list_meta); INIT_LIST_HEAD(&impl->list_node); impl->ref_count = 1; @@ -160,7 +160,7 @@ MppMetaImpl *MppMetaService::get_meta(const char *tag, const char *caller) mpp_spinlock_lock(&mLock); list_add_tail(&impl->list_meta, &mlist_meta); mpp_spinlock_unlock(&mLock); - __sync_fetch_and_add(&meta_count, 1); + MPP_FETCH_ADD(&meta_count, 1); } else { mpp_err_f("failed to malloc meta data\n"); } @@ -172,7 +172,7 @@ void MppMetaService::put_meta(MppMetaImpl *meta) if (finished) return ; - RK_S32 ref_count = __sync_sub_and_fetch(&meta->ref_count, 1); + RK_S32 ref_count = MPP_SUB_FETCH(&meta->ref_count, 1); if (ref_count > 0) return; @@ -185,7 +185,7 @@ void MppMetaService::put_meta(MppMetaImpl *meta) mpp_spinlock_lock(&mLock); list_del_init(&meta->list_meta); mpp_spinlock_unlock(&mLock); - __sync_fetch_and_sub(&meta_count, 1); + MPP_FETCH_SUB(&meta_count, 1); mpp_free(meta); } @@ -226,7 +226,7 @@ MPP_RET mpp_meta_inc_ref(MppMeta meta) MppMetaImpl *impl = (MppMetaImpl *)meta; - __sync_add_and_fetch(&impl->ref_count, 1); + MPP_FETCH_ADD(&impl->ref_count, 1); return MPP_OK; } @@ -239,7 +239,7 @@ RK_S32 mpp_meta_size(MppMeta meta) MppMetaImpl *impl = (MppMetaImpl *)meta; - return __sync_fetch_and_add(&impl->node_count, 0); + return MPP_FETCH_ADD(&impl->node_count, 0); } #define MPP_META_ACCESSOR(func_type, arg_type, key_type, key_field) \ @@ -255,10 +255,10 @@ RK_S32 mpp_meta_size(MppMeta meta) return MPP_NOK; \ MppMetaImpl *impl = (MppMetaImpl *)meta; \ MppMetaVal *meta_val = &impl->vals[index]; \ - if (__sync_bool_compare_and_swap(&meta_val->state, META_VAL_INVALID, META_VAL_VALID)) \ - __sync_fetch_and_add(&impl->node_count, 1); \ + if (MPP_BOOL_CAS(&meta_val->state, META_VAL_INVALID, META_VAL_VALID)) \ + MPP_FETCH_ADD(&impl->node_count, 1); \ meta_val->key_field = val; \ - __sync_fetch_and_or(&meta_val->state, META_VAL_READY); \ + MPP_FETCH_OR(&meta_val->state, META_VAL_READY); \ return MPP_OK; \ } \ MPP_RET mpp_meta_get_##func_type(MppMeta meta, MppMetaKey key, arg_type *val) \ @@ -274,9 +274,9 @@ RK_S32 mpp_meta_size(MppMeta meta) MppMetaImpl *impl = (MppMetaImpl *)meta; \ MppMetaVal *meta_val = &impl->vals[index]; \ MPP_RET ret = MPP_NOK; \ - if (__sync_bool_compare_and_swap(&meta_val->state, META_VAL_VALID | META_VAL_READY, META_VAL_INVALID)) { \ + if (MPP_BOOL_CAS(&meta_val->state, META_VAL_VALID | META_VAL_READY, META_VAL_INVALID)) { \ *val = meta_val->key_field; \ - __sync_fetch_and_sub(&impl->node_count, 1); \ + MPP_FETCH_SUB(&impl->node_count, 1); \ ret = MPP_OK; \ } \ return ret; \ diff --git a/osal/inc/mpp_lock.h b/osal/inc/mpp_lock.h index 8bdef28d..73fe21f5 100644 --- a/osal/inc/mpp_lock.h +++ b/osal/inc/mpp_lock.h @@ -21,6 +21,27 @@ #include "rk_type.h" +#define MPP_FETCH_ADD __sync_fetch_and_add +#define MPP_FETCH_SUB __sync_fetch_and_sub +#define MPP_FETCH_OR __sync_fetch_and_or +#define MPP_FETCH_AND __sync_fetch_and_and +#define MPP_FETCH_XOR __sync_fetch_and_xor +#define MPP_FETCH_NAND __sync_fetch_and_nand + +#define MPP_ADD_FETCH __sync_add_and_fetch +#define MPP_SUB_FETCH __sync_sub_and_fetch +#define MPP_OR_FETCH __sync_or_and_fetch +#define MPP_AND_FETCH __sync_and_and_fetch +#define MPP_XOR_FETCH __sync_xor_and_fetch +#define MPP_NAND_FETCH __sync_nand_and_fetch + +#define MPP_BOOL_CAS __sync_bool_compare_and_swap +#define MPP_VAL_CAS __sync_val_compare_and_swap + +#define MPP_SYNC __sync_synchronize +#define MPP_SYNC_TEST_SET __sync_lock_test_and_set +#define MPP_SYNC_CLR __sync_lock_release + #ifdef __cplusplus extern "C" { #endif diff --git a/osal/mpp_lock.cpp b/osal/mpp_lock.cpp index 273df28e..c8811afb 100644 --- a/osal/mpp_lock.cpp +++ b/osal/mpp_lock.cpp @@ -24,12 +24,12 @@ void mpp_spinlock_init(spinlock_t *lock) { - __sync_lock_test_and_set(&lock->lock, LOCK_IDLE); + MPP_SYNC_CLR(&lock->lock); } void mpp_spinlock_lock(spinlock_t *lock) { - while (!__sync_bool_compare_and_swap(&lock->lock, LOCK_IDLE, LOCK_BUSY)) { + while (!MPP_BOOL_CAS(&lock->lock, LOCK_IDLE, LOCK_BUSY)) { asm("NOP"); asm("NOP"); } @@ -37,12 +37,10 @@ void mpp_spinlock_lock(spinlock_t *lock) void mpp_spinlock_unlock(spinlock_t *lock) { - RK_U32 val = __sync_lock_test_and_set(&lock->lock, LOCK_IDLE); - if (!val) - mpp_err("unlock %p when it is idle", lock); + MPP_SYNC_CLR(&lock->lock); } bool mpp_spinlock_trylock(spinlock_t *lock) { - return __sync_bool_compare_and_swap(&lock->lock, LOCK_IDLE, LOCK_BUSY); + return MPP_BOOL_CAS(&lock->lock, LOCK_IDLE, LOCK_BUSY); } diff --git a/utils/mpi_dec_utils.c b/utils/mpi_dec_utils.c index 457ccceb..554900f1 100644 --- a/utils/mpi_dec_utils.c +++ b/utils/mpi_dec_utils.c @@ -25,6 +25,7 @@ #include "mpp_env.h" #include "mpp_mem.h" #include "mpp_log.h" +#include "mpp_lock.h" #include "mpp_time.h" #include "mpp_common.h" #include "mpp_buffer.h" @@ -403,7 +404,7 @@ void reader_stop(FileReader reader) { FileReaderImpl *impl = (FileReaderImpl*)reader; - if (__sync_bool_compare_and_swap(&impl->thd_stop, 0, 1)) + if (MPP_BOOL_CAS(&impl->thd_stop, 0, 1)) pthread_join(impl->thd, NULL); }