以下均为原子操作。使用了一个全局的锁。
extern unsigned int atomic_add(unsigned int *area, int val);
extern unsigned int atomic_or(unsigned int *area, unsigned int mask);
extern unsigned int atomic_sub(unsigned int *area, int val);
extern void queue_atomic(unsigned int *anchor,
unsigned int *elem, unsigned int disp);
#include "atomic.h"
#include "OSMutex.h"
static OSMutex sAtomicMutex;
//加法
unsigned int atomic_add(unsigned int *area, int val)
{
OSMutexLocker locker(&sAtomicMutex);
*area += val;
return *area;
}
//减法
unsigned int atomic_sub(unsigned int *area,int val)
{
return atomic_add(area,-val);
}
//或 函数返回之前的值
unsigned int atomic_or(unsigned int *area, unsigned int val)
{
unsigned int oldval;
OSMutexLocker locker(&sAtomicMutex);
oldval=*area;
*area = oldval | val;
return oldval;
}
//对比area与oval是否相同,如果相同则替换成nval
unsigned int compare_and_store(unsigned int oval, unsigned int nval, unsigned int *area)
{
int rv;
OSMutexLocker locker(&sAtomicMutex);
if( oval == *area )
{
rv=1;
*area = nval;
}
else
rv=0;
return rv;
}