[libc] avoid cmpxchg on the fastpath of callonce by SchrodingerZhu · Pull Request #91748 · llvm/llvm-project (original) (raw)

@llvm/pr-subscribers-libc

Author: Schrodinger ZHU Yifan (SchrodingerZhu)

Changes

Avoid cmpxchg operation if the function has already been called.
The destination operand of cmpxchg may receive a write cycle without regard to the result of the comparison


Full diff: https://github.com/llvm/llvm-project/pull/91748.diff

1 Files Affected:

diff --git a/libc/src/__support/threads/linux/callonce.cpp b/libc/src/__support/threads/linux/callonce.cpp index 1c29db5f5c1a1..b48a514a44875 100644 --- a/libc/src/__support/threads/linux/callonce.cpp +++ b/libc/src/__support/threads/linux/callonce.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===//

#include "src/__support/threads/callonce.h" +#include "src/__support/macros/optimization.h" #include "src/__support/threads/linux/futex_utils.h"

namespace LIBC_NAMESPACE { @@ -21,6 +22,12 @@ int callonce(CallOnceFlag *flag, CallOnceCallback *func) {

FutexWordType not_called = NOT_CALLED;