[mpp_lock]: Add gcc atomic macro define

Change-Id: I3e94cc7be9a51f5d674a132c0a2e6f7afba61d34
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2021-11-03 11:25:02 +08:00
parent 786b79f976
commit f0c57cde02
6 changed files with 50 additions and 28 deletions

View File

@@ -21,6 +21,7 @@
#include "mpp_log.h" #include "mpp_log.h"
#include "mpp_env.h" #include "mpp_env.h"
#include "mpp_hash.h" #include "mpp_hash.h"
#include "mpp_lock.h"
#include "mpp_mem_pool.h" #include "mpp_mem_pool.h"
#include "mpp_buffer_impl.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) 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; bool ret;
do { do {
RK_U32 old_max = total_max; RK_U32 old_max = total_max;
RK_U32 new_max = MPP_MAX(total, old_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); } while (!ret);
} }
void MppBufferService::dec_total(RK_U32 size) 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() RK_U32 mpp_buffer_total_now()

View File

@@ -21,6 +21,7 @@
#include "mpp_log.h" #include "mpp_log.h"
#include "mpp_mem.h" #include "mpp_mem.h"
#include "mpp_env.h" #include "mpp_env.h"
#include "mpp_lock.h"
#include "mpp_time.h" #include "mpp_time.h"
#include "mpp_cluster.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); 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", cluster_dbg_flow("%s sched task %x -> %x cas ret %d act %d\n",
node_name, old_st, new_st, ret, action); node_name, old_st, new_st, ret, action);
} while (!ret); } while (!ret);
@@ -294,7 +295,7 @@ MPP_RET mpp_node_task_detach(MppNodeTask *task)
const char *node_name = task->node_name; const char *node_name = task->node_name;
MppNodeProc *proc = task->proc; MppNodeProc *proc = task->proc;
__sync_fetch_and_and(&node->state, ~NODE_VALID); MPP_FETCH_AND(&node->state, ~NODE_VALID);
mpp_node_task_schedule(task); 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); new_st = old_st ^ (NODE_WAIT | NODE_RUN);
mpp_assert(old_st & NODE_WAIT); 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); } while (!ret);
list_add_tail(&task->list_sched, &p->list_task); list_add_tail(&task->list_sched, &p->list_task);
@@ -503,7 +504,7 @@ static void cluster_worker_run_task(ClusterWorker *p)
old_st = state; old_st = state;
// NOTE: clear NODE_RUN and NODE_SIGNAL, set NODE_WAIT // NOTE: clear NODE_RUN and NODE_SIGNAL, set NODE_WAIT
new_st = old_st ^ (NODE_SIGNAL | NODE_WAIT | NODE_RUN); 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); } while (!cas_ret);
cluster_dbg_flow("%s run state %x -> %x signal -> wait\n", p->name, old_st, new_st); 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; old_st = node->state;
new_st = old_st ^ (NODE_IDLE | NODE_RUN); 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); } while (!cas_ret);
mpp_assert(node->state & NODE_IDLE); mpp_assert(node->state & NODE_IDLE);
mpp_assert(!(node->state & NODE_RUN)); 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(priority < MAX_PRIORITY);
mpp_assert(p); 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); snprintf(impl->name, sizeof(impl->name) - 1, "%s:%d", p->name, impl->node_id);
mpp_node_task_attach(&impl->task, impl, queue, &impl->work); 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); cluster_dbg_flow("%s:%d attached %d\n", p->name, impl->node_id, p->node_count);

View File

@@ -148,7 +148,7 @@ MppMetaImpl *MppMetaService::get_meta(const char *tag, const char *caller)
strncpy(impl->tag, tag_src, sizeof(impl->tag)); strncpy(impl->tag, tag_src, sizeof(impl->tag));
impl->caller = caller; 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_meta);
INIT_LIST_HEAD(&impl->list_node); INIT_LIST_HEAD(&impl->list_node);
impl->ref_count = 1; impl->ref_count = 1;
@@ -160,7 +160,7 @@ MppMetaImpl *MppMetaService::get_meta(const char *tag, const char *caller)
mpp_spinlock_lock(&mLock); mpp_spinlock_lock(&mLock);
list_add_tail(&impl->list_meta, &mlist_meta); list_add_tail(&impl->list_meta, &mlist_meta);
mpp_spinlock_unlock(&mLock); mpp_spinlock_unlock(&mLock);
__sync_fetch_and_add(&meta_count, 1); MPP_FETCH_ADD(&meta_count, 1);
} else { } else {
mpp_err_f("failed to malloc meta data\n"); mpp_err_f("failed to malloc meta data\n");
} }
@@ -172,7 +172,7 @@ void MppMetaService::put_meta(MppMetaImpl *meta)
if (finished) if (finished)
return ; 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) if (ref_count > 0)
return; return;
@@ -185,7 +185,7 @@ void MppMetaService::put_meta(MppMetaImpl *meta)
mpp_spinlock_lock(&mLock); mpp_spinlock_lock(&mLock);
list_del_init(&meta->list_meta); list_del_init(&meta->list_meta);
mpp_spinlock_unlock(&mLock); mpp_spinlock_unlock(&mLock);
__sync_fetch_and_sub(&meta_count, 1); MPP_FETCH_SUB(&meta_count, 1);
mpp_free(meta); mpp_free(meta);
} }
@@ -226,7 +226,7 @@ MPP_RET mpp_meta_inc_ref(MppMeta meta)
MppMetaImpl *impl = (MppMetaImpl *)meta; MppMetaImpl *impl = (MppMetaImpl *)meta;
__sync_add_and_fetch(&impl->ref_count, 1); MPP_FETCH_ADD(&impl->ref_count, 1);
return MPP_OK; return MPP_OK;
} }
@@ -239,7 +239,7 @@ RK_S32 mpp_meta_size(MppMeta meta)
MppMetaImpl *impl = (MppMetaImpl *)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) \ #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; \ return MPP_NOK; \
MppMetaImpl *impl = (MppMetaImpl *)meta; \ MppMetaImpl *impl = (MppMetaImpl *)meta; \
MppMetaVal *meta_val = &impl->vals[index]; \ MppMetaVal *meta_val = &impl->vals[index]; \
if (__sync_bool_compare_and_swap(&meta_val->state, META_VAL_INVALID, META_VAL_VALID)) \ if (MPP_BOOL_CAS(&meta_val->state, META_VAL_INVALID, META_VAL_VALID)) \
__sync_fetch_and_add(&impl->node_count, 1); \ MPP_FETCH_ADD(&impl->node_count, 1); \
meta_val->key_field = val; \ 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; \ return MPP_OK; \
} \ } \
MPP_RET mpp_meta_get_##func_type(MppMeta meta, MppMetaKey key, arg_type *val) \ 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; \ MppMetaImpl *impl = (MppMetaImpl *)meta; \
MppMetaVal *meta_val = &impl->vals[index]; \ MppMetaVal *meta_val = &impl->vals[index]; \
MPP_RET ret = MPP_NOK; \ 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; \ *val = meta_val->key_field; \
__sync_fetch_and_sub(&impl->node_count, 1); \ MPP_FETCH_SUB(&impl->node_count, 1); \
ret = MPP_OK; \ ret = MPP_OK; \
} \ } \
return ret; \ return ret; \

View File

@@ -21,6 +21,27 @@
#include "rk_type.h" #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 #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@@ -24,12 +24,12 @@
void mpp_spinlock_init(spinlock_t *lock) 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) 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");
asm("NOP"); asm("NOP");
} }
@@ -37,12 +37,10 @@ void mpp_spinlock_lock(spinlock_t *lock)
void mpp_spinlock_unlock(spinlock_t *lock) void mpp_spinlock_unlock(spinlock_t *lock)
{ {
RK_U32 val = __sync_lock_test_and_set(&lock->lock, LOCK_IDLE); MPP_SYNC_CLR(&lock->lock);
if (!val)
mpp_err("unlock %p when it is idle", lock);
} }
bool mpp_spinlock_trylock(spinlock_t *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);
} }

View File

@@ -25,6 +25,7 @@
#include "mpp_env.h" #include "mpp_env.h"
#include "mpp_mem.h" #include "mpp_mem.h"
#include "mpp_log.h" #include "mpp_log.h"
#include "mpp_lock.h"
#include "mpp_time.h" #include "mpp_time.h"
#include "mpp_common.h" #include "mpp_common.h"
#include "mpp_buffer.h" #include "mpp_buffer.h"
@@ -403,7 +404,7 @@ void reader_stop(FileReader reader)
{ {
FileReaderImpl *impl = (FileReaderImpl*)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); pthread_join(impl->thd, NULL);
} }