| // Copyright 2026 The IREE Authors | |
| // | |
| // Licensed 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 | |
| // <pthread.h> declarations for wasm32 source compatibility. | |
| // | |
| // Freestanding wasm does not currently provide pthread implementations. Keep | |
| // this header minimal so code that only mentions pthread types can compile, but | |
| // any actual pthread use must fail at link time until the libc heap, errno, and | |
| // worker lifecycle have a real thread/TLS contract. | |
| #ifndef IREE_WASM_LIBC_PTHREAD_H_ | |
| #define IREE_WASM_LIBC_PTHREAD_H_ | |
| #include <stddef.h> | |
| #include <time.h> | |
| // Opaque thread types. | |
| typedef unsigned long pthread_t; | |
| typedef int pthread_once_t; | |
| // Attribute types (opaque structs with enough storage). | |
| typedef struct { | |
| int __detachstate; | |
| size_t __stacksize; | |
| } pthread_attr_t; | |
| typedef struct { | |
| int __type; | |
| } pthread_mutexattr_t; | |
| typedef struct { | |
| int __clock; | |
| } pthread_condattr_t; | |
| // Synchronization types. | |
| typedef struct { | |
| int __lock; | |
| } pthread_mutex_t; | |
| typedef struct { | |
| int __lock; | |
| } pthread_cond_t; | |
| // Initializer macros. | |
| #define PTHREAD_MUTEX_INITIALIZER {0} | |
| #define PTHREAD_COND_INITIALIZER {0} | |
| #define PTHREAD_ONCE_INIT 0 | |
| // Detach state. | |
| #define PTHREAD_CREATE_JOINABLE 0 | |
| #define PTHREAD_CREATE_DETACHED 1 | |
| // Scheduling policy (minimal — wasm has no scheduler control). | |
| #define SCHED_OTHER 0 | |
| struct sched_param { | |
| int sched_priority; | |
| }; | |
| // Thread management. | |
| int pthread_create(pthread_t* thread, const pthread_attr_t* attr, | |
| void* (*start_routine)(void*), void* arg); | |
| int pthread_join(pthread_t thread, void** retval); | |
| pthread_t pthread_self(void); | |
| // Thread attributes. | |
| int pthread_attr_init(pthread_attr_t* attr); | |
| int pthread_attr_destroy(pthread_attr_t* attr); | |
| int pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate); | |
| int pthread_attr_setstacksize(pthread_attr_t* attr, size_t stacksize); | |
| // Thread naming. | |
| int pthread_setname_np(pthread_t thread, const char* name); | |
| // Thread scheduling (stubs — no scheduler control on wasm). | |
| int pthread_setschedparam(pthread_t thread, int policy, | |
| const struct sched_param* param); | |
| int pthread_getschedparam(pthread_t thread, int* policy, | |
| struct sched_param* param); | |
| // Mutex. | |
| int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr); | |
| int pthread_mutex_destroy(pthread_mutex_t* mutex); | |
| int pthread_mutex_lock(pthread_mutex_t* mutex); | |
| int pthread_mutex_trylock(pthread_mutex_t* mutex); | |
| int pthread_mutex_unlock(pthread_mutex_t* mutex); | |
| // Condition variable. | |
| int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr); | |
| int pthread_cond_destroy(pthread_cond_t* cond); | |
| int pthread_cond_signal(pthread_cond_t* cond); | |
| int pthread_cond_broadcast(pthread_cond_t* cond); | |
| int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex); | |
| int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, | |
| const struct timespec* abstime); | |
| // Condition variable attributes. | |
| int pthread_condattr_init(pthread_condattr_t* attr); | |
| int pthread_condattr_destroy(pthread_condattr_t* attr); | |
| int pthread_condattr_setclock(pthread_condattr_t* attr, int clock_id); | |
| // Once. | |
| int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); | |
| #endif // IREE_WASM_LIBC_PTHREAD_H_ |