diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -344,6 +344,19 @@ }]; } +def CndT : TypeDecl<"cnd_t"> { + let Decl = [{ + typedef struct { + void *__qfront; + void *__qback; + struct { + unsigned char __w[4]; + int __t; + } __qmtx; + } cnd_t; + }]; +} + def ThreadStartT : TypeDecl<"thrd_start_t"> { let Decl = "typedef int (*thrd_start_t)(void *);"; } @@ -363,6 +376,7 @@ OnceFlag, CallOnceFuncT, MtxT, + CndT, ThreadStartT, ]; diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -189,6 +189,11 @@ # threads.h entrypoints libc.src.threads.call_once + libc.src.threads.cnd_broadcast + libc.src.threads.cnd_destroy + libc.src.threads.cnd_init + libc.src.threads.cnd_signal + libc.src.threads.cnd_wait libc.src.threads.mtx_destroy libc.src.threads.mtx_init libc.src.threads.mtx_lock diff --git a/libc/spec/spec.td b/libc/spec/spec.td --- a/libc/spec/spec.td +++ b/libc/spec/spec.td @@ -77,6 +77,8 @@ def CallOnceFuncType : NamedType<"__call_once_func_t">; def MtxTType : NamedType<"mtx_t">; def MtxTTypePtr : PtrType; +def CndTType : NamedType<"cnd_t">; +def CndTTypePtr : PtrType; def ThrdStartTType : NamedType<"thrd_start_t">; def ThrdTType : NamedType<"thrd_t">; def ThrdTTypePtr : PtrType; diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -549,6 +549,7 @@ [ OnceFlagType, CallOnceFuncType, + CndTType, MtxTType, ThrdStartTType, ThrdTType, @@ -572,6 +573,42 @@ ArgSpec, ] >, + FunctionSpec< + "cnd_broadcast", + RetValSpec, + [ + ArgSpec, + ] + >, + FunctionSpec< + "cnd_destroy", + RetValSpec, + [ + ArgSpec, + ] + >, + FunctionSpec< + "cnd_init", + RetValSpec, + [ + ArgSpec, + ] + >, + FunctionSpec< + "cnd_signal", + RetValSpec, + [ + ArgSpec, + ] + >, + FunctionSpec< + "cnd_wait", + RetValSpec, + [ + ArgSpec, + ArgSpec, + ] + >, FunctionSpec< "mtx_init", RetValSpec, diff --git a/libc/src/threads/CMakeLists.txt b/libc/src/threads/CMakeLists.txt --- a/libc/src/threads/CMakeLists.txt +++ b/libc/src/threads/CMakeLists.txt @@ -50,3 +50,38 @@ DEPENDS .${LIBC_TARGET_OS}.mtx_unlock ) + +add_entrypoint_object( + cnd_init + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.cnd_init +) + +add_entrypoint_object( + cnd_destroy + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.cnd_destroy +) + +add_entrypoint_object( + cnd_wait + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.cnd_wait +) + +add_entrypoint_object( + cnd_signal + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.cnd_signal +) + +add_entrypoint_object( + cnd_broadcast + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.cnd_broadcast +) diff --git a/libc/src/threads/cnd_broadcast.h b/libc/src/threads/cnd_broadcast.h new file mode 100644 --- /dev/null +++ b/libc/src/threads/cnd_broadcast.h @@ -0,0 +1,20 @@ +//===-- Implementation header for cnd_broadcast 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_CND_BROADCAST_H +#define LLVM_LIBC_SRC_THREADS_CND_BROADCAST_H + +#include "include/threads.h" + +namespace __llvm_libc { + +int cnd_broadcast(cnd_t *cond); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_THREADS_CND_BROADCAST_H diff --git a/libc/src/threads/cnd_destroy.h b/libc/src/threads/cnd_destroy.h new file mode 100644 --- /dev/null +++ b/libc/src/threads/cnd_destroy.h @@ -0,0 +1,20 @@ +//===-- Implementation header for cnd_destroy 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_CND_DESTROY_H +#define LLVM_LIBC_SRC_THREADS_CND_DESTROY_H + +#include "include/threads.h" + +namespace __llvm_libc { + +void cnd_destroy(cnd_t *cond); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_THREADS_CND_DESTROY_H diff --git a/libc/src/threads/cnd_init.h b/libc/src/threads/cnd_init.h new file mode 100644 --- /dev/null +++ b/libc/src/threads/cnd_init.h @@ -0,0 +1,20 @@ +//===-- Implementation header for cnd_init 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_CND_INIT_H +#define LLVM_LIBC_SRC_THREADS_CND_INIT_H + +#include "include/threads.h" + +namespace __llvm_libc { + +int cnd_init(cnd_t *cond); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_THREADS_CND_INIT_H diff --git a/libc/src/threads/cnd_signal.h b/libc/src/threads/cnd_signal.h new file mode 100644 --- /dev/null +++ b/libc/src/threads/cnd_signal.h @@ -0,0 +1,20 @@ +//===-- Implementation header for cnd_signal 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_CND_SIGNAL_H +#define LLVM_LIBC_SRC_THREADS_CND_SIGNAL_H + +#include "include/threads.h" + +namespace __llvm_libc { + +int cnd_signal(cnd_t *cond); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_THREADS_CND_SIGNAL_H diff --git a/libc/src/threads/cnd_wait.h b/libc/src/threads/cnd_wait.h new file mode 100644 --- /dev/null +++ b/libc/src/threads/cnd_wait.h @@ -0,0 +1,20 @@ +//===-- Implementation header for cnd_wait 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_CND_WAIT_H +#define LLVM_LIBC_SRC_THREADS_CND_WAIT_H + +#include "include/threads.h" + +namespace __llvm_libc { + +int cnd_wait(cnd_t *cond, mtx_t *mutex); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_THREADS_CND_WAIT_H diff --git a/libc/src/threads/linux/CMakeLists.txt b/libc/src/threads/linux/CMakeLists.txt --- a/libc/src/threads/linux/CMakeLists.txt +++ b/libc/src/threads/linux/CMakeLists.txt @@ -113,3 +113,58 @@ .threads_utils libc.include.threads ) + +add_entrypoint_object( + cnd_init + SRCS + cnd_init.cpp + HDRS + ../cnd_init.h + DEPENDS + .threads_utils + libc.include.threads +) + +add_entrypoint_object( + cnd_destroy + SRCS + cnd_destroy.cpp + HDRS + ../cnd_destroy.h + DEPENDS + .threads_utils + libc.include.threads +) + +add_entrypoint_object( + cnd_wait + SRCS + cnd_wait.cpp + HDRS + ../cnd_wait.h + DEPENDS + .threads_utils + libc.include.threads +) + +add_entrypoint_object( + cnd_signal + SRCS + cnd_signal.cpp + HDRS + ../cnd_signal.h + DEPENDS + .threads_utils + libc.include.threads +) + +add_entrypoint_object( + cnd_broadcast + SRCS + cnd_broadcast.cpp + HDRS + ../cnd_broadcast.h + DEPENDS + .threads_utils + libc.include.threads +) diff --git a/libc/src/threads/linux/cnd_broadcast.cpp b/libc/src/threads/linux/cnd_broadcast.cpp new file mode 100644 --- /dev/null +++ b/libc/src/threads/linux/cnd_broadcast.cpp @@ -0,0 +1,16 @@ +//===-- Linux implementation of the cnd_broadcast 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 "src/threads/cnd_broadcast.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(int, cnd_broadcast, (cnd_t * cond)) { return thrd_success; } + +} // namespace __llvm_libc diff --git a/libc/src/threads/linux/cnd_destroy.cpp b/libc/src/threads/linux/cnd_destroy.cpp new file mode 100644 --- /dev/null +++ b/libc/src/threads/linux/cnd_destroy.cpp @@ -0,0 +1,16 @@ +//===-- Linux implementation of the cnd_destroy 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 "src/threads/cnd_destroy.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(void, cnd_destroy, (cnd_t * cond)) { } + +} // namespace __llvm_libc diff --git a/libc/src/threads/linux/cnd_init.cpp b/libc/src/threads/linux/cnd_init.cpp new file mode 100644 --- /dev/null +++ b/libc/src/threads/linux/cnd_init.cpp @@ -0,0 +1,16 @@ +//===-- Linux implementation of the cnd_init 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 "src/threads/cnd_init.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(int, cnd_init, (cnd_t * cond)) { return thrd_success; } + +} // namespace __llvm_libc diff --git a/libc/src/threads/linux/cnd_signal.cpp b/libc/src/threads/linux/cnd_signal.cpp new file mode 100644 --- /dev/null +++ b/libc/src/threads/linux/cnd_signal.cpp @@ -0,0 +1,16 @@ +//===-- Linux implementation of the cnd_signal 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 "src/threads/cnd_signal.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(int, cnd_signal, (cnd_t * cond)) { return thrd_success; } + +} // namespace __llvm_libc diff --git a/libc/src/threads/linux/cnd_wait.cpp b/libc/src/threads/linux/cnd_wait.cpp new file mode 100644 --- /dev/null +++ b/libc/src/threads/linux/cnd_wait.cpp @@ -0,0 +1,18 @@ +//===-- Linux implementation of the cnd_wait 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 "src/threads/cnd_wait.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(int, cnd_wait, (cnd_t * cond, mtx_t *mutex)) { + return thrd_success; +} + +} // namespace __llvm_libc