用 -1 'or'值的目的是什么?
what is purpose of 'or' a value with -1?
我在Android框架中遇到了以下代码,想知道android_atomic_or(-1, &mFD)
的目的是什么? 对于 32 位 int,-1
0xFFFFFFFF,或者具有任何值的 -1 应始终为 -1。如果我的理解是正确的,下面的代码对我来说没有意义。
https://android.googlesource.com/platform/frameworks/native/+/6eabaa3/libs/utils/MemoryHeapBase.cpp
行:150
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);
}
}
而且,这是(之一)android_atomic_or的实现
http://androidxref.com/5.0.0_r2/xref/system/core/include/cutils/atomic-x86.h#135
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只是(value|*ptr)的原子版本,但我不确定,因为我无法真正读取程序集。我一定误解了这里的一些东西。感谢您的帮助。
这
类似于标准atomic_fetch_or()
(我怀疑它现在只存在,因为 Android 启动时 C11 不可用)。
该函数在修改之前返回原始值。因此,它将获取以前的值,然后设置该值中的所有位。
参见第 139 行和第 142 行,假设循环只执行一次。Compare And Set 是原子所需的基本操作之一(另一个是比较和交换,它更通用一些)。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- 在 if 语句中处理多个 or 的更优雅的方法是什么
- C++中的"and"、"or"等关键字的目的是什么?
- 'must have an argument of class or enumerated type'到底是什么意思
- 在给定的代码示例中,在 vector::p ush_back() 中"the argument is copied (or moved)"到底是什么意思?
- "Expected '(' for function-style cast or type construction"错误是什么意思?
- "member function already defined or declared" - 这是什么意思?
- 用 -1 'or'值的目的是什么?