Какова цель функции atomic_forced_read в glibc? - PullRequest
4 голосов
/ 24 сентября 2019

Я пытаюсь понять цель определения atomic_forced_read, которое часто встречается в реализации GNU libc malloc.c.

Я не очень хорош, когда речь идет о встроенной сборке, но похоже,это возвращает точно такое же значение, с тем же типом, что и входное значение.что мне здесь не хватает?

Определение атомарного принудительного чтения в 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

Ссылка на atomic.h

https://code.woboq.org/userspace/glibc/include/atomic.h.html

1 Ответ

3 голосов
/ 25 сентября 2019

Одно использование имеет значение 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 из памяти ровно один раз.

...