diff --git a/libc/src/threads/linux/call_once.cpp b/libc/src/threads/linux/call_once.cpp deleted file mode 100644 index 5cdd8ebfd190..000000000000 --- a/libc/src/threads/linux/call_once.cpp +++ /dev/null @@ -1,67 +0,0 @@ -//===-- Linux implementation of the call_once function --------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "Futex.h" - -#include "src/__support/CPP/atomic.h" -#include "src/__support/OSUtil/syscall.h" // For syscall functions. -#include "src/__support/common.h" -#include "src/threads/call_once.h" -#include "src/threads/linux/Futex.h" - -#include -#include -#include // For syscall numbers. -#include // For call_once related type definition. - -namespace LIBC_NAMESPACE { - -static constexpr FutexWordType START = 0x11; -static constexpr FutexWordType WAITING = 0x22; -static constexpr FutexWordType FINISH = 0x33; -static constexpr once_flag ONCE_FLAG_INIT_VAL = ONCE_FLAG_INIT; - -LLVM_LIBC_FUNCTION(void, call_once, - (once_flag * flag, __call_once_func_t func)) { - auto *futex_word = reinterpret_cast *>(flag); - static_assert(sizeof(*futex_word) == sizeof(once_flag)); - - FutexWordType not_called = ONCE_FLAG_INIT_VAL.__word; - - // The C standard wording says: - // - // The completion of the function func synchronizes with all - // previous or subsequent calls to call_once with the same - // flag variable. - // - // What this means is that, the call_once call can return only after - // the called function |func| returns. So, we use futexes to synchronize - // calls with the same flag value. - if (futex_word->compare_exchange_strong(not_called, START)) { - func(); - auto status = futex_word->exchange(FINISH); - if (status == WAITING) { - LIBC_NAMESPACE::syscall_impl(FUTEX_SYSCALL_ID, &futex_word->val, - FUTEX_WAKE_PRIVATE, - INT_MAX, // Wake all waiters. - 0, 0, 0); - } - return; - } - - FutexWordType status = START; - if (futex_word->compare_exchange_strong(status, WAITING) || - status == WAITING) { - LIBC_NAMESPACE::syscall_impl( - FUTEX_SYSCALL_ID, &futex_word->val, FUTEX_WAIT_PRIVATE, - WAITING, // Block only if status is still |WAITING|. - 0, 0, 0); - } -} - -} // namespace LIBC_NAMESPACE diff --git a/libc/src/threads/linux/thread_start_args.h.def b/libc/src/threads/linux/thread_start_args.h.def deleted file mode 100644 index cc990a37548b..000000000000 --- a/libc/src/threads/linux/thread_start_args.h.def +++ /dev/null @@ -1,11 +0,0 @@ -//===-- Implementation of the get_start_args_addr function ------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -%%include_file(${thread_start_args})