用 -1 'or'值的目的是什么?

what is purpose of 'or' a value with -1?

本文关键字:是什么 or      更新时间:2023-10-16

我在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 是原子所需的基本操作之一(另一个是比较和交换,它更通用一些)。