diff --git a/libc/cmake/modules/LLVMLibCRules.cmake b/libc/cmake/modules/LLVMLibCRules.cmake --- a/libc/cmake/modules/LLVMLibCRules.cmake +++ b/libc/cmake/modules/LLVMLibCRules.cmake @@ -355,7 +355,7 @@ ${LIBC_UNITTEST_DEPENDS} ) - target_link_libraries(${target_name} PRIVATE LibcUnitTest) + target_link_libraries(${target_name} PRIVATE LibcUnitTest libc_test_utils) add_custom_command( TARGET ${target_name} diff --git a/libc/utils/CMakeLists.txt b/libc/utils/CMakeLists.txt --- a/libc/utils/CMakeLists.txt +++ b/libc/utils/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(HdrGen) add_subdirectory(UnitTest) add_subdirectory(benchmarks) +add_subdirectory(testutils) diff --git a/libc/utils/testutils/CMakeLists.txt b/libc/utils/testutils/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/CMakeLists.txt @@ -0,0 +1,12 @@ + +add_library( + libc_test_utils + abort.cpp + Support.h + Thread.cpp + Thread.h +) + +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + target_sources(libc_test_utils PRIVATE ${LIBC_TARGET_OS}/sleep.cpp) +endif() diff --git a/libc/utils/testutils/Support.h b/libc/utils/testutils/Support.h new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/Support.h @@ -0,0 +1,9 @@ + +namespace __llvm_libc { +namespace testutils { + +int sleep(unsigned int seconds); +void abort(); + +} // namespace testutils +} // namespace __llvm_libc diff --git a/libc/utils/testutils/Thread.h b/libc/utils/testutils/Thread.h new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/Thread.h @@ -0,0 +1,27 @@ + +#ifndef LLVM_LIBC_UTILS_TESTING_THREAD_H +#define LLVM_LIBC_UTILS_TESTING_THREAD_H + +namespace __llvm_libc { +namespace testutils { + +class Thread { +public: + typedef void FuncTypeNoArg(); + typedef void FuncTypeOneArg(void *); + + explicit Thread(FuncTypeNoArg &&F); + explicit Thread(FuncTypeOneArg &&F, void *Arg); + + ~Thread(); + + void join(); + +private: + void *StdThreadPtr; +}; + +} // namespace testutils +} // namespace __llvm_libc + +#endif // LLVM_LIBC_UTILS_TESTING_THREAD_H diff --git a/libc/utils/testutils/Thread.cpp b/libc/utils/testutils/Thread.cpp new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/Thread.cpp @@ -0,0 +1,19 @@ + +#include "Thread.h" + +#include + +namespace __llvm_libc { +namespace testutils { + +Thread::Thread(FuncTypeNoArg &&F) : StdThreadPtr(new std::thread(F)) {} + +Thread::Thread(FuncTypeOneArg &&F, void *Arg) + : StdThreadPtr(new std::thread(F, Arg)) {} + +Thread::~Thread() { delete reinterpret_cast(StdThreadPtr); } + +void Thread::join() { reinterpret_cast(StdThreadPtr)->join(); } + +} // namespace testutils +} // namespace __llvm_libc diff --git a/libc/utils/testutils/abort.cpp b/libc/utils/testutils/abort.cpp new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/abort.cpp @@ -0,0 +1,10 @@ + +#include + +namespace __llvm_libc { +namespace testutils { + +void abort() { std::abort(); } + +} // namespace testutils +} // namespace __llvm_libc diff --git a/libc/utils/testutils/linux/sleep.cpp b/libc/utils/testutils/linux/sleep.cpp new file mode 100644 --- /dev/null +++ b/libc/utils/testutils/linux/sleep.cpp @@ -0,0 +1,10 @@ + +#include + +namespace __llvm_libc { +namespace testutils { + +int sleep(unsigned int Seconds) { return ::sleep(Seconds); } + +} // namespace testutils +} // namespace __llvm_libc