android - 'or' 的目的是 -1 的值?

标签 android c++

我在 Android 框架中遇到了以下代码,想知道 android_atomic_or(-1, &mFD) 的目的是什么? -1 对于 32 位 int 是 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 Aand Set是原子学需要的基本操作之一(另一个是compare and exchange,比较通用一点) .

关于android - 'or' 的目的是 -1 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938100/

相关文章:

java - 具有多个条件的 String.equals()(以及对结果的一项操作)

android - PBKDF2 与 Android 上的 SHA256

用于广域网 (WAN) 中直接 pc 到 pc 通信的 c++ 库

c# - 将 T-SQL 连接到 C++ 或 C#

c++ - 在不关闭程序的情况下写入文件后从文件中获取保存的数据

C++ 模板复杂图像读取类执行时间慢,声明和实现分离

java - 如何使用 cursoradapter 实现自动完成

android - 我如何将 HTTP 响应从一个 Activity 传递到 android 中的另一个 Activity

java - 如何在java中将rgb颜色转换为int

c++ - 两帧之间的密集光流