| //===-- 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 |