Files
tactility/Modules/pthread-module/source/module.cpp
Ken Van Hoeylandt 19b11eb9a8 Remove TactilityC and Firmware subprojects (#638)
- Removed TactilityC, moved its symbols to existing modules and several new ones (pthread-module, c-symbols-module, cpp-symbols-module, posix-symbols-module, freertos-module).
- Removed Firmware subproject and moved main() into Tactility subproject.
- Strengthened application archive, path, version, stack-size, and device validation.
- Moved symbol resolution for elf_loader to app-esp32-module.
- Improved `struct Module` declarations and made module and symbol definitions in modules more consistent.
- Removed old http download code from Tactility subproject.
- Rename app-module's source files for consistency.
- Add missing pthread symbols.
- Kernel module symbols are now resolvable on all platforms.
2026-08-29 21:06:43 +02:00

109 lines
3.5 KiB
C++

// SPDX-License-Identifier: Apache-2.0
#include <pthread/module.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
// pthread_mutex_timedlock / pthread_rwlock_timed{rd,wr}lock / sem_timedwait belong to POSIX's
// optional "Timeouts" feature (_POSIX_TIMEOUTS, from <unistd.h>) - Apple's libc never implements
// it, so this is the portable, spec-sanctioned test rather than an OS-name check.
#if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0
#define TT_PTHREAD_HAS_TIMEOUTS 1
#else
#define TT_PTHREAD_HAS_TIMEOUTS 0
#endif
#if !defined(ESP_PLATFORM) && defined(__GLIBC_PREREQ)
#if __GLIBC_PREREQ(2, 30)
#define TT_PTHREAD_HAS_CLOCKWAIT 1
#else
#define TT_PTHREAD_HAS_CLOCKWAIT 0
#endif
#else
#define TT_PTHREAD_HAS_CLOCKWAIT 0
#endif
extern "C" {
static const ModuleSymbol SYMBOLS[] = {
// pthread
DEFINE_MODULE_SYMBOL(pthread_attr_init),
DEFINE_MODULE_SYMBOL(pthread_attr_setstacksize),
DEFINE_MODULE_SYMBOL(pthread_create),
DEFINE_MODULE_SYMBOL(pthread_detach),
DEFINE_MODULE_SYMBOL(pthread_exit),
DEFINE_MODULE_SYMBOL(pthread_join),
// pthread_cond
DEFINE_MODULE_SYMBOL(pthread_cond_init),
DEFINE_MODULE_SYMBOL(pthread_cond_broadcast),
#if TT_PTHREAD_HAS_CLOCKWAIT
DEFINE_MODULE_SYMBOL(pthread_cond_clockwait),
#endif
DEFINE_MODULE_SYMBOL(pthread_cond_destroy),
DEFINE_MODULE_SYMBOL(pthread_cond_signal),
DEFINE_MODULE_SYMBOL(pthread_cond_timedwait),
// pthread_mutex
DEFINE_MODULE_SYMBOL(pthread_mutex_destroy),
DEFINE_MODULE_SYMBOL(pthread_mutex_init),
DEFINE_MODULE_SYMBOL(pthread_mutex_lock),
#if TT_PTHREAD_HAS_TIMEOUTS
DEFINE_MODULE_SYMBOL(pthread_mutex_timedlock),
#endif
DEFINE_MODULE_SYMBOL(pthread_mutex_trylock),
DEFINE_MODULE_SYMBOL(pthread_mutex_unlock),
// pthread_mutexattr
DEFINE_MODULE_SYMBOL(pthread_mutexattr_destroy),
#ifndef ESP_PLATFORM
DEFINE_MODULE_SYMBOL(pthread_mutexattr_getpshared),
DEFINE_MODULE_SYMBOL(pthread_mutexattr_setpshared),
#endif
DEFINE_MODULE_SYMBOL(pthread_mutexattr_gettype),
DEFINE_MODULE_SYMBOL(pthread_mutexattr_init),
DEFINE_MODULE_SYMBOL(pthread_mutexattr_settype),
// sem
DEFINE_MODULE_SYMBOL(sem_destroy),
DEFINE_MODULE_SYMBOL(sem_getvalue),
DEFINE_MODULE_SYMBOL(sem_init),
DEFINE_MODULE_SYMBOL(sem_post),
#if TT_PTHREAD_HAS_TIMEOUTS
DEFINE_MODULE_SYMBOL(sem_timedwait),
#endif
DEFINE_MODULE_SYMBOL(sem_trywait),
DEFINE_MODULE_SYMBOL(sem_wait),
// pthread_rwlock
#if TT_PTHREAD_HAS_CLOCKWAIT
DEFINE_MODULE_SYMBOL(pthread_rwlock_clockrdlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_clockwrlock),
#endif
#if TT_PTHREAD_HAS_TIMEOUTS
DEFINE_MODULE_SYMBOL(pthread_rwlock_timedrdlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_timedwrlock),
#endif
#ifndef ESP_PLATFORM
DEFINE_MODULE_SYMBOL(pthread_rwlockattr_destroy),
DEFINE_MODULE_SYMBOL(pthread_rwlockattr_getpshared),
DEFINE_MODULE_SYMBOL(pthread_rwlockattr_init),
DEFINE_MODULE_SYMBOL(pthread_rwlockattr_setpshared),
#endif
DEFINE_MODULE_SYMBOL(pthread_rwlock_destroy),
DEFINE_MODULE_SYMBOL(pthread_rwlock_init),
DEFINE_MODULE_SYMBOL(pthread_rwlock_rdlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_tryrdlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_trywrlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_unlock),
DEFINE_MODULE_SYMBOL(pthread_rwlock_wrlock),
MODULE_SYMBOL_TERMINATOR,
};
Module pthread_module = {
.name = "pthread",
.start = nullptr,
.stop = nullptr,
.drivers = nullptr,
.symbols = SYMBOLS,
.internal = nullptr,
};
}