Одно использование имеет значение atomic_forced_read
:
#if HAVE_MALLOC_INIT_HOOK
void (*hook) (void) = atomic_forced_read(__malloc_initialize_hook);
if (hook != NULL)
(*hook)();
#endif
Похоже, что __malloc_initialize_hook
можно изменить из другого потока, так что если __malloc_initialize_hook
загружается еще раз из памяти после NULL
проверьте, что его значение могло измениться обратно на NULL
.
atomic_forced_read
гарантирует, что __malloc_initialize_hook
загружен в регистр из-за ограничения вывода =r
, поэтому __malloc_initialize_hook
не перезагружается изпамять после проверки NULL
.Этот пустой asm
нарушает зависимость компилятора hook
от __malloc_initialize_hook
, поскольку hook
теперь инициализируется с __x
, хранящимся в регистре, а не __malloc_initialize_hook
.После инициализации hook
с помощью __x
последняя исчезает и не может быть перезагружена.
В режиме C11, __malloc_initialize_hook
может быть atomic_uintptr_t
и может использоваться atomic_load_explicit(&__malloc_initialize_hook, memory_order_relaxed)
вместо atomic_forced_read
для загрузки __malloc_initialize_hook
из памяти ровно один раз.