mre*_*555 5 c glibc atomic libc inline-assembly
我试图理解atomic_forced_read定义的目的,它经常出现在malloc.c的GNU libc实现中。
我不太擅长内联汇编,但看起来这会返回完全相同的值,并且类型与输入值相同。我在这里缺少什么?
原子强制读取定义在atomic.h中
523 #ifndef atomic_forced_read
524 # define atomic_forced_read(x) \
525 ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; })
526 #endif
Run Code Online (Sandbox Code Playgroud)
链接到atomic.h
https://code.woboq.org/userspace/glibc/include/atomic.h.html
一种用法是atomic_forced_read:
#if HAVE_MALLOC_INIT_HOOK
void (*hook) (void) = atomic_forced_read(__malloc_initialize_hook);
if (hook != NULL)
(*hook)();
#endif
Run Code Online (Sandbox Code Playgroud)
似乎__malloc_initialize_hook可以从另一个线程更改,因此如果在检查__malloc_initialize_hook后再次从内存加载,则NULL其值可能已更改回NULL。
atomic_forced_read确保__malloc_initialize_hook由于=r输出限制而将其加载到寄存器中,以便__malloc_initialize_hook在检查后不会从内存中重新加载NULL。该空破坏了编译器对onasm的依赖,因为现在是通过存储在寄存器中而不是存储来进行初始化的。用初始化后,后者就消失了并且无法重新加载。hook__malloc_initialize_hookhook__x__malloc_initialize_hookhook__x
在 C11 模式下,__malloc_initialize_hook可以atomic_uintptr_t并且atomic_load_explicit(&__malloc_initialize_hook, memory_order_relaxed)可以使用它来代替从内存atomic_forced_read加载__malloc_initialize_hook一次。
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |