blob: a3bf7fe91584e1cc76ac0ade9e590a2dc21db807 [file] [edit]
// 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_