我在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)的原子版本,但我不确定,因为我无法真正读取程序集。我必须在这里误解一些事情。谢谢你的帮助。
答案 0 :(得分:1)
这类似于标准atomic_fetch_or()
(我怀疑它现在只存在,因为当Android启动时C11不可用。)
该函数在修改之前返回原始值。因此它将获得先前的值,然后设置值中的所有位。
参见第139和142行,假设循环只执行一次。 C ompare A nd S et是atomics所需的基本操作之一(另一种是比较和交换,这是更普遍的)