/
redgpu
/
clspv
Обзор
Документация
Войти
/
redgpu
/
clspv
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
third_party/llvm/libc/src/threads/linux/thrd_join.cpp
44 строки
2 KB
Constantine Tarasenkov
python3 utils/fetch_sources.py
04 сен 2021, 14:35
04 сен 2021, 14:35
4a0ab4c
Код
Авторство
О чём код?
//===-- 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 "src/threads/thrd_join.h" #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 { LLVM_LIBC_FUNCTION(int, thrd_join, (thrd_t * thread, int *retval)) { FutexData *clear_tid_address = reinterpret_cast<FutexData *>(thread->__clear_tid); // 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. 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); } *retval = thread->__retval; if (__llvm_libc::munmap(thread->__stack, thread->__stack_size) == -1) return thrd_error; return thrd_success; } } // namespace __llvm_libc