'或'值的目的是什么?

时间:2015-06-19 12:25:13

标签: android c++

我在Android框架中遇到了以下代码,并想知道android_atomic_or(-1, &mFD)的目的是什么?对于32位int,-1为0xFFFFFFFF,对于任何值,void MemoryHeapBase::dispose() { int fd = android_atomic_or(-1, &mFD); //mFd is a file descriptor if (fd >= 0) { if (mNeedUnmap) { //LOGD("munmap(fd=%d, base=%p, size=%lu)", fd, mBase, mSize); munmap(mBase, mSize); } mBase = 0; mSize = 0; close(fd); } } 应始终为-1。如果我的理解是正确的,下面的代码对我来说没有意义。

https://android.googlesource.com/platform/frameworks/native/+/6eabaa3/libs/utils/MemoryHeapBase.cpp

行:150

134extern ANDROID_ATOMIC_INLINE int32_t
135android_atomic_or(int32_t value, volatile int32_t *ptr)
136{
137    int32_t prev, status;
138    do {
139        prev = *ptr;
140        status = android_atomic_cas(prev, prev | value, ptr);
141    } while (__builtin_expect(status != 0, 0));
142    return prev;
143}

73 android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr)
74{
75    int32_t prev;
76    __asm__ __volatile__ ("lock; cmpxchgl %1, %2"
77                          : "=a" (prev)
78                          : "q" (new_value), "m" (*ptr), "0" (old_value)
79                          : "memory");
80    return prev != old_value;
81}
82

而且,这是(一个)android_atomic_or

的实现

http://androidxref.com/5.0.0_r2/xref/system/core/include/cutils/atomic-x86.h#135

Android Studio version : 1.2.1.1

我认为android_atomic_or只是(value | * ptr)的原子版本,但我不确定,因为我无法真正读取程序集。我必须在这里误解一些事情。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这类似于标准atomic_fetch_or()(我怀疑它现在只存在,因为当Android启动时C11不可用。)

该函数在修改之前返回原始值。因此它将获得先前的值,然后设置值中的所有位。

参见第139和142行,假设循环只执行一次。 C ompare A nd S et是atomics所需的基本操作之一(另一种是比较和交换,这是更普遍的)