[libc-commits] [libc] 3c88489 - [libc]Revert "Add linux implementations of thrd_create and thrd_join functions."

Siva Chandra Reddy via libc-commits libc-commits at lists.llvm.org
Thu Mar 5 20:50:27 PST 2020


Author: Siva Chandra Reddy
Date: 2020-03-05T20:46:13-08:00
New Revision: 3c88489a063c8f318aefacb75e8fcc9a115369a2

URL: https://github.com/llvm/llvm-project/commit/3c88489a063c8f318aefacb75e8fcc9a115369a2
DIFF: https://github.com/llvm/llvm-project/commit/3c88489a063c8f318aefacb75e8fcc9a115369a2.diff

LOG: [libc]Revert "Add linux implementations of thrd_create and thrd_join functions."

This reverts commit abc040e9533011a62a25c93b07b4fc31c8a641f7 as the bots
are failing because of this.

Added: 
    

Modified: 
    libc/config/linux/api.td
    libc/include/CMakeLists.txt
    libc/include/threads.h.def
    libc/lib/CMakeLists.txt
    libc/src/CMakeLists.txt
    libc/test/src/CMakeLists.txt

Removed: 
    libc/config/linux/threads.h.in
    libc/src/threads/CMakeLists.txt
    libc/src/threads/linux/CMakeLists.txt
    libc/src/threads/linux/thrd_create.cpp
    libc/src/threads/linux/thrd_join.cpp
    libc/src/threads/linux/thread_utils.h
    libc/src/threads/thrd_create.h
    libc/src/threads/thrd_join.h
    libc/test/src/threads/CMakeLists.txt
    libc/test/src/threads/thrd_test.cpp


################################################################################
diff  --git a/libc/config/linux/api.td b/libc/config/linux/api.td
index 2f9a840c6d86..1c9fa8a36c2e 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 58f58a3add8b..000000000000
--- 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 bbc41b0ec151..db5f371f75f3 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 e99fcfcd89f1..276f78bb35a7 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 83b19fd2c9ef..b67f8e4c686b 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 4e661c838e51..7f8ef92e6cc5 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 b4bbe81c92ff..000000000000
--- 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 809a365a834d..000000000000
--- 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 650c38cab924..000000000000
--- 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 <linux/futex.h> // For futex operations.
-#include <linux/sched.h> // For CLONE_* flags.
-#include <stdint.h>
-
-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<FutexData *>(thread->__clear_tid);
-  *clear_tid_address = ThreadParams::ClearTIDValue;
-
-  long clone_result = __llvm_libc::syscall(
-      SYS_clone, clone_flags,
-      reinterpret_cast<uintptr_t>(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 7237354f89e9..000000000000
--- 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 <linux/futex.h> // For futex operations.
-#include <stdatomic.h>   // For atomic_load.
-
-namespace __llvm_libc {
-
-int LLVM_LIBC_ENTRYPOINT(thrd_join)(thrd_t *thread, int *retval) {
-  FutexData *clear_tid_address =
-      reinterpret_cast<FutexData *>(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 b6f41b47d81e..000000000000
--- 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 <stdint.h>
-
-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 311929020905..000000000000
--- 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 495b049d5f06..000000000000
--- 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 2ff4ca4d1252..bf56591e1d47 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 9607a258cd66..000000000000
--- 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 be9e410a46aa..000000000000
--- 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<int *>(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);
-  }
-}


        


More information about the libc-commits mailing list