//===-- Implementation of the pthread_cond_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 "pthread_cond_init.h" #include "include/llvm-libc-macros/pthread-macros.h" #include "src/__support/CPP/new.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" #include "src/__support/macros/null_check.h" #include "src/__support/threads/CndVar.h" #include "hdr/errno_macros.h" // EINVAL #include "hdr/time_macros.h" // CLOCK_MONOTONIC, CLOCK_REALTIME namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(int, pthread_cond_init, (pthread_cond_t *__restrict cond, const pthread_condattr_t *__restrict attr)) { LIBC_CRASH_ON_NULLPTR(cond); // POSIX.1 says that CLOCK_REALTIME shall be used if the clock is not // monotonic explicitly. pthread_condattr_t condattr{ /*clock=*/CLOCK_REALTIME, /*pshared=*/PTHREAD_PROCESS_PRIVATE, }; if (attr) condattr = *attr; bool is_shared; switch (condattr.pshared) { case PTHREAD_PROCESS_PRIVATE: is_shared = false; break; case PTHREAD_PROCESS_SHARED: is_shared = true; break; default: return EINVAL; } bool is_realtime; switch (condattr.clock) { case CLOCK_MONOTONIC: is_realtime = false; break; case CLOCK_REALTIME: is_realtime = true; break; default: return EINVAL; } new (cond) CndVar(is_shared, is_realtime); return 0; } } // namespace LIBC_NAMESPACE_DECL