From 3c88489a063c8f318aefacb75e8fcc9a115369a2 Mon Sep 17 00:00:00 2001 From: Siva Chandra Reddy Date: Thu, 5 Mar 2020 20:46:13 -0800 Subject: [PATCH] [libc]Revert "Add linux implementations of thrd_create and thrd_join functions." This reverts commit abc040e9533011a62a25c93b07b4fc31c8a641f7 as the bots are failing because of this. --- libc/config/linux/api.td | 13 ----- libc/config/linux/threads.h.in | 17 ------ libc/include/CMakeLists.txt | 4 -- libc/include/threads.h.def | 2 - libc/lib/CMakeLists.txt | 4 -- libc/src/CMakeLists.txt | 1 - libc/src/threads/CMakeLists.txt | 3 -- libc/src/threads/linux/CMakeLists.txt | 37 ------------- libc/src/threads/linux/thrd_create.cpp | 74 -------------------------- libc/src/threads/linux/thrd_join.cpp | 44 --------------- libc/src/threads/linux/thread_utils.h | 21 -------- libc/src/threads/thrd_create.h | 20 ------- libc/src/threads/thrd_join.h | 20 ------- libc/test/src/CMakeLists.txt | 1 - libc/test/src/threads/CMakeLists.txt | 16 ------ libc/test/src/threads/thrd_test.cpp | 52 ------------------ 16 files changed, 329 deletions(-) delete mode 100644 libc/config/linux/threads.h.in delete mode 100644 libc/src/threads/CMakeLists.txt delete mode 100644 libc/src/threads/linux/CMakeLists.txt delete mode 100644 libc/src/threads/linux/thrd_create.cpp delete mode 100644 libc/src/threads/linux/thrd_join.cpp delete mode 100644 libc/src/threads/linux/thread_utils.h delete mode 100644 libc/src/threads/thrd_create.h delete mode 100644 libc/src/threads/thrd_join.h delete mode 100644 libc/test/src/threads/CMakeLists.txt delete mode 100644 libc/test/src/threads/thrd_test.cpp diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td index 2f9a840c6d8641..1c9fa8a36c2e57 100644 --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -150,15 +150,7 @@ def SignalAPI : PublicAPI<"signal.h"> { ]; } -def ThreadStartT : TypeDecl<"thrd_start_t"> { - let Decl = "typedef int (*thrd_start_t)(void *);"; -} - def ThreadsAPI : PublicAPI<"threads.h"> { - let TypeDeclarations = [ - ThreadStartT, - ]; - let Enumerations = [ "mtx_plain", "mtx_recursive", @@ -169,9 +161,4 @@ def ThreadsAPI : PublicAPI<"threads.h"> { "thrd_error", "thrd_nomem", ]; - - let Functions = [ - "thrd_create", - "thrd_join", - ]; } diff --git a/libc/config/linux/threads.h.in b/libc/config/linux/threads.h.in deleted file mode 100644 index 58f58a3add8b6d..00000000000000 --- a/libc/config/linux/threads.h.in +++ /dev/null @@ -1,17 +0,0 @@ -//===--------- Linux specific definitions of types from threads.h ---------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -%%begin() - -typedef struct { - unsigned char __clear_tid[4]; - int __tid; - void *__stack; - int __stack_size; - int __retval; -} thrd_t; diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index bbc41b0ec151c6..db5f371f75f3cc 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -39,12 +39,8 @@ add_gen_header( threads_h DEF_FILE threads.h.def GEN_HDR threads.h - PARAMS - platform_threads=../config/${LIBC_TARGET_OS}/threads.h.in DEPENDS llvm_libc_common_h - DATA_FILES - ../config/${LIBC_TARGET_OS}/threads.h.in ) add_gen_header( diff --git a/libc/include/threads.h.def b/libc/include/threads.h.def index e99fcfcd89f19a..276f78bb35a79a 100644 --- a/libc/include/threads.h.def +++ b/libc/include/threads.h.def @@ -11,8 +11,6 @@ #include <__llvm-libc-common.h> -%%include_file(${platform_threads}) - %%public_api() #endif // LLVM_LIBC_THREADS_H diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt index 83b19fd2c9efb4..b67f8e4c686bb5 100644 --- a/libc/lib/CMakeLists.txt +++ b/libc/lib/CMakeLists.txt @@ -22,10 +22,6 @@ add_entrypoint_library( # stdlib.h entrypoints _Exit abort - - # threads.h entrypoints - thrd_create - thrd_join ) add_entrypoint_library( diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index 4e661c838e51b6..7f8ef92e6cc51a 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -5,6 +5,5 @@ add_subdirectory(stdlib) add_subdirectory(string) # TODO: Add this target conditional to the target OS. add_subdirectory(sys) -add_subdirectory(threads) add_subdirectory(__support) diff --git a/libc/src/threads/CMakeLists.txt b/libc/src/threads/CMakeLists.txt deleted file mode 100644 index b4bbe81c92ff2e..00000000000000 --- a/libc/src/threads/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) - add_subdirectory(${LIBC_TARGET_OS}) -endif() diff --git a/libc/src/threads/linux/CMakeLists.txt b/libc/src/threads/linux/CMakeLists.txt deleted file mode 100644 index 809a365a834dd8..00000000000000 --- a/libc/src/threads/linux/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -add_header_library( - threads_utils - HDRS - thread_utils.h -) - -add_entrypoint_object( - thrd_create - SRCS - thrd_create.cpp - HDRS - ../thrd_create.h - DEPENDS - errno_h - linux_syscall_h - mmap - support_common_h - sys_syscall_h - threads_h - threads_utils - __errno_location -) - -add_entrypoint_object( - thrd_join - SRCS - thrd_join.cpp - HDRS - ../thrd_join.h - DEPENDS - linux_syscall_h - munmap - support_common_h - sys_syscall_h - threads_h - threads_utils -) diff --git a/libc/src/threads/linux/thrd_create.cpp b/libc/src/threads/linux/thrd_create.cpp deleted file mode 100644 index 650c38cab9248c..00000000000000 --- a/libc/src/threads/linux/thrd_create.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//===---------- Linux implementation of the thrd_create 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 "config/linux/syscall.h" // For syscall function. -#include "include/errno.h" // For E* error values. -#include "include/sys/mman.h" // For PROT_* and MAP_* definitions. -#include "include/sys/syscall.h" // For syscall numbers. -#include "include/threads.h" // For thrd_* type definitions. -#include "src/__support/common.h" -#include "src/errno/llvmlibc_errno.h" -#include "src/sys/mman/mmap.h" -#include "src/sys/mman/munmap.h" -#include "src/threads/linux/thread_utils.h" - -#include // For futex operations. -#include // For CLONE_* flags. -#include - -namespace __llvm_libc { - -static void start_thread(thrd_t *thread, thrd_start_t func, void *arg) { - __llvm_libc::syscall(SYS_exit, thread->__retval = func(arg)); -} - -int LLVM_LIBC_ENTRYPOINT(thrd_create)(thrd_t *thread, thrd_start_t func, - void *arg) { - unsigned clone_flags = - CLONE_VM // Share the memory space with the parent. - | CLONE_FS // Share the file system with the parent. - | CLONE_FILES // Share the files with the parent. - | CLONE_SIGHAND // Share the signal handlers with the parent. - | CLONE_THREAD // Same thread group as the parent. - | CLONE_SYSVSEM // Share a single list of System V semaphore adjustment - // values - | CLONE_PARENT_SETTID // Set child thread ID in |ptid| of the parent. - | CLONE_CHILD_CLEARTID; // Let the kernel clear the tid address and futex - // wake the joining thread. - // TODO: Add the CLONE_SETTLS flag and setup the TLS area correctly when - // making the clone syscall. - - void *stack = __llvm_libc::mmap(nullptr, ThreadParams::DefaultStackSize, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (stack == MAP_FAILED) - return llvmlibc_errno == ENOMEM ? thrd_nomem : thrd_error; - - thread->__stack = stack; - thread->__stack_size = ThreadParams::DefaultStackSize; - thread->__retval = -1; - FutexData *clear_tid_address = - reinterpret_cast(thread->__clear_tid); - *clear_tid_address = ThreadParams::ClearTIDValue; - - long clone_result = __llvm_libc::syscall( - SYS_clone, clone_flags, - reinterpret_cast(stack) + ThreadParams::DefaultStackSize - 1, - &thread->__tid, clear_tid_address, 0); - - if (clone_result == 0) { - start_thread(thread, func, arg); - } else if (clone_result < 0) { - int error_val = -clone_result; - return error_val == ENOMEM ? thrd_nomem : thrd_error; - } - - return thrd_success; -} - -} // namespace __llvm_libc diff --git a/libc/src/threads/linux/thrd_join.cpp b/libc/src/threads/linux/thrd_join.cpp deleted file mode 100644 index 7237354f89e93b..00000000000000 --- a/libc/src/threads/linux/thrd_join.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//===----------- Linux implementation of the thrd_join 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 "config/linux/syscall.h" // For syscall function. -#include "include/sys/syscall.h" // For syscall numbers. -#include "include/threads.h" // For thrd_* type definitions. -#include "src/__support/common.h" -#include "src/sys/mman/munmap.h" -#include "src/threads/linux/thread_utils.h" - -#include // For futex operations. -#include // For atomic_load. - -namespace __llvm_libc { - -int LLVM_LIBC_ENTRYPOINT(thrd_join)(thrd_t *thread, int *retval) { - FutexData *clear_tid_address = - reinterpret_cast(thread->__clear_tid); - - while (atomic_load(clear_tid_address) != 0) { - // We cannot do a FUTEX_WAIT_PRIVATE here as the kernel does a - // FUTEX_WAKE and not a FUTEX_WAKE_PRIVATE. - __llvm_libc::syscall(SYS_futex, clear_tid_address, FUTEX_WAIT, - ThreadParams::ClearTIDValue, nullptr); - - // The kernel should set the value at the clear tid address to zero. - // If not, it is a spurious wake and we should continue to wait on - // the futex. - } - - *retval = thread->__retval; - - if (__llvm_libc::munmap(thread->__stack, thread->__stack_size) == -1) - return thrd_error; - - return thrd_success; -} - -} // namespace __llvm_libc diff --git a/libc/src/threads/linux/thread_utils.h b/libc/src/threads/linux/thread_utils.h deleted file mode 100644 index b6f41b47d81e73..00000000000000 --- a/libc/src/threads/linux/thread_utils.h +++ /dev/null @@ -1,21 +0,0 @@ -//===--- Linux specific definitions to support mutex operations --*- 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_THREADS_LINUX_THREAD_UTILS_H -#define LLVM_LIBC_SRC_THREADS_LINUX_THREAD_UTILS_H - -#include - -using FutexData = _Atomic uint32_t; - -struct ThreadParams { - static constexpr uintptr_t DefaultStackSize = 1 << 15; // 32 KB - static constexpr uint32_t ClearTIDValue = 0xABCD1234; -}; - -#endif // LLVM_LIBC_SRC_THREADS_LINUX_THREAD_UTILS_H diff --git a/libc/src/threads/thrd_create.h b/libc/src/threads/thrd_create.h deleted file mode 100644 index 31192902090589..00000000000000 --- a/libc/src/threads/thrd_create.h +++ /dev/null @@ -1,20 +0,0 @@ -//===------- Implementation header for thrd_create 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_THREADS_LINUX_THRD_CREATE_H -#define LLVM_LIBC_SRC_THREADS_LINUX_THRD_CREATE_H - -#include "include/threads.h" - -namespace __llvm_libc { - -int thrd_create(thrd_t *thread, thrd_start_t func, void *arg); - -} // namespace __llvm_libc - -#endif // LLVM_LIBC_SRC_THREADS_LINUX_THRD_CREATE_H diff --git a/libc/src/threads/thrd_join.h b/libc/src/threads/thrd_join.h deleted file mode 100644 index 495b049d5f0654..00000000000000 --- a/libc/src/threads/thrd_join.h +++ /dev/null @@ -1,20 +0,0 @@ -//===-------- Implementation header for thrd_join 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_THREADS_LINUX_THRD_JOIN_H -#define LLVM_LIBC_SRC_THREADS_LINUX_THRD_JOIN_H - -#include "include/threads.h" - -namespace __llvm_libc { - -int thrd_join(thrd_t *thread, int *retval); - -} // namespace __llvm_libc - -#endif // LLVM_LIBC_SRC_THREADS_LINUX_THRD_JOIN_H diff --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt index 2ff4ca4d125267..bf56591e1d473a 100644 --- a/libc/test/src/CMakeLists.txt +++ b/libc/test/src/CMakeLists.txt @@ -3,4 +3,3 @@ add_subdirectory(signal) add_subdirectory(stdlib) add_subdirectory(string) add_subdirectory(sys) -add_subdirectory(threads) diff --git a/libc/test/src/threads/CMakeLists.txt b/libc/test/src/threads/CMakeLists.txt deleted file mode 100644 index 9607a258cd661f..00000000000000 --- a/libc/test/src/threads/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -add_libc_testsuite(libc_threads_unittests) - -add_libc_unittest( - thrd_test - SUITE - libc_threads_unittests - SRCS - thrd_test.cpp - DEPENDS - __errno_location - mmap - munmap - threads_h - thrd_create - thrd_join -) diff --git a/libc/test/src/threads/thrd_test.cpp b/libc/test/src/threads/thrd_test.cpp deleted file mode 100644 index be9e410a46aa76..00000000000000 --- a/libc/test/src/threads/thrd_test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -//===---------------------- Unittests for thrd_t --------------------------===// -// -// 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/threads.h" -#include "src/threads/thrd_create.h" -#include "src/threads/thrd_join.h" -#include "utils/UnitTest/Test.h" - -static constexpr int thread_count = 1000; -static int counter = 0; -static int thread_func(void *) { - ++counter; - return 0; -} - -TEST(ThreadTest, CreateAndJoin) { - for (counter = 0; counter <= thread_count;) { - thrd_t thread; - int old_counter_val = counter; - ASSERT_EQ(__llvm_libc::thrd_create(&thread, thread_func, nullptr), - (int)thrd_success); - int retval = thread_count + 1; // Start with a retval we dont expect. - ASSERT_EQ(__llvm_libc::thrd_join(&thread, &retval), (int)thrd_success); - ASSERT_EQ(retval, 0); - ASSERT_EQ(counter, old_counter_val + 1); - } -} - -static int return_arg(void *arg) { return *reinterpret_cast(arg); } - -TEST(ThreadTest, SpawnAndJoin) { - thrd_t thread_list[thread_count]; - int args[thread_count]; - - for (int i = 0; i < thread_count; ++i) { - args[i] = i; - ASSERT_EQ(__llvm_libc::thrd_create(thread_list + i, return_arg, args + i), - (int)thrd_success); - } - - for (int i = 0; i < thread_count; ++i) { - int retval = thread_count + 1; // Start with a retval we dont expect. - ASSERT_EQ(__llvm_libc::thrd_join(&thread_list[i], &retval), - (int)thrd_success); - ASSERT_EQ(retval, i); - } -}