mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-06 01:26:49 +08:00
[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:
@@ -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()
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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; \
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user