mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-22 21:23:07 +03:00
* Use newlib libc library This change adds libcmin.a, which is created from newlib libc by selectively removing some of the object files (mostly related to heap management). The list of files is available in tools/sdk/lib/make_libcmin.sh. Files which are not needed are commented out. This change adds support for various functions which were missing, like sscanf, strftime, etc. * Fix some of the time functions * Redirect stdout to serial * Implement __putc_r * Switch to custom newlib build Built from https://github.com/igrr/newlib-xtensa using: ./configure --with-newlib --enable-multilib --disable-newlib-io-c99-formats --enable-newlib-supplied-syscalls --enable-target-optspace --program-transform-name="s&^&xtensa-lx106-elf-&" --disable-option-checking --with-target-subdir=xtensa-lx106-elf --target=xtensa-lx106-elf --enable-newlib-nano-formatted-io --enable-newlib-reent-small --prefix=path-to-arduino-core/tools/sdk/libc CROSS_CFLAGS="-DMALLOC_PROVIDED -DSIGNAL_PROVIDED -DABORT_PROVIDED" make make install * Update tests
432 lines
14 KiB
C
432 lines
14 KiB
C
/* pthread.h
|
|
*
|
|
* Written by Joel Sherrill <joel@OARcorp.com>.
|
|
*
|
|
* COPYRIGHT (c) 1989-2013.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose without fee is hereby granted, provided that this entire notice
|
|
* is included in all copies of any software which is or includes a copy
|
|
* or modification of this software.
|
|
*
|
|
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
|
|
* WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION
|
|
* OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS
|
|
* SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
#ifndef __PTHREAD_h
|
|
#define __PTHREAD_h
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <unistd.h>
|
|
|
|
#if defined(_POSIX_THREADS)
|
|
|
|
#include <sys/types.h>
|
|
#include <time.h>
|
|
#include <sys/sched.h>
|
|
#include <sys/cdefs.h>
|
|
|
|
struct _pthread_cleanup_context {
|
|
void (*_routine)(void *);
|
|
void *_arg;
|
|
int _canceltype;
|
|
struct _pthread_cleanup_context *_previous;
|
|
};
|
|
|
|
/* Register Fork Handlers */
|
|
int _EXFUN(pthread_atfork,(void (*prepare)(void), void (*parent)(void),
|
|
void (*child)(void)));
|
|
|
|
/* Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81 */
|
|
|
|
int _EXFUN(pthread_mutexattr_init, (pthread_mutexattr_t *__attr));
|
|
int _EXFUN(pthread_mutexattr_destroy, (pthread_mutexattr_t *__attr));
|
|
int _EXFUN(pthread_mutexattr_getpshared,
|
|
(_CONST pthread_mutexattr_t *__attr, int *__pshared));
|
|
int _EXFUN(pthread_mutexattr_setpshared,
|
|
(pthread_mutexattr_t *__attr, int __pshared));
|
|
|
|
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
|
|
|
|
/* Single UNIX Specification 2 Mutex Attributes types */
|
|
|
|
int _EXFUN(pthread_mutexattr_gettype,
|
|
(_CONST pthread_mutexattr_t *__attr, int *__kind));
|
|
int _EXFUN(pthread_mutexattr_settype,
|
|
(pthread_mutexattr_t *__attr, int __kind));
|
|
|
|
#endif
|
|
|
|
/* Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87 */
|
|
|
|
int _EXFUN(pthread_mutex_init,
|
|
(pthread_mutex_t *__mutex, _CONST pthread_mutexattr_t *__attr));
|
|
int _EXFUN(pthread_mutex_destroy, (pthread_mutex_t *__mutex));
|
|
|
|
/* This is used to statically initialize a pthread_mutex_t. Example:
|
|
|
|
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
*/
|
|
|
|
#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF)
|
|
|
|
/* Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
|
|
NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29 */
|
|
|
|
int _EXFUN(pthread_mutex_lock, (pthread_mutex_t *__mutex));
|
|
int _EXFUN(pthread_mutex_trylock, (pthread_mutex_t *__mutex));
|
|
int _EXFUN(pthread_mutex_unlock, (pthread_mutex_t *__mutex));
|
|
|
|
#if defined(_POSIX_TIMEOUTS)
|
|
|
|
int _EXFUN(pthread_mutex_timedlock,
|
|
(pthread_mutex_t *__mutex, _CONST struct timespec *__timeout));
|
|
|
|
#endif /* _POSIX_TIMEOUTS */
|
|
|
|
/* Condition Variable Initialization Attributes, P1003.1c/Draft 10, p. 96 */
|
|
|
|
int _EXFUN(pthread_condattr_init, (pthread_condattr_t *__attr));
|
|
int _EXFUN(pthread_condattr_destroy, (pthread_condattr_t *__attr));
|
|
int _EXFUN(pthread_condattr_getpshared,
|
|
(_CONST pthread_condattr_t *__attr, int *__pshared));
|
|
int _EXFUN(pthread_condattr_setpshared,
|
|
(pthread_condattr_t *__attr, int __pshared));
|
|
|
|
/* Initializing and Destroying a Condition Variable, P1003.1c/Draft 10, p. 87 */
|
|
|
|
int _EXFUN(pthread_cond_init,
|
|
(pthread_cond_t *__cond, _CONST pthread_condattr_t *__attr));
|
|
int _EXFUN(pthread_cond_destroy, (pthread_cond_t *__mutex));
|
|
|
|
/* This is used to statically initialize a pthread_cond_t. Example:
|
|
|
|
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
|
*/
|
|
|
|
#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) 0xFFFFFFFF)
|
|
|
|
/* Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101 */
|
|
|
|
int _EXFUN(pthread_cond_signal, (pthread_cond_t *__cond));
|
|
int _EXFUN(pthread_cond_broadcast, (pthread_cond_t *__cond));
|
|
|
|
/* Waiting on a Condition, P1003.1c/Draft 10, p. 105 */
|
|
|
|
int _EXFUN(pthread_cond_wait,
|
|
(pthread_cond_t *__cond, pthread_mutex_t *__mutex));
|
|
|
|
int _EXFUN(pthread_cond_timedwait,
|
|
(pthread_cond_t *__cond, pthread_mutex_t *__mutex,
|
|
_CONST struct timespec *__abstime));
|
|
|
|
#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
|
|
|
|
/* Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 */
|
|
|
|
int _EXFUN(pthread_attr_setscope,
|
|
(pthread_attr_t *__attr, int __contentionscope));
|
|
int _EXFUN(pthread_attr_getscope,
|
|
(_CONST pthread_attr_t *__attr, int *__contentionscope));
|
|
int _EXFUN(pthread_attr_setinheritsched,
|
|
(pthread_attr_t *__attr, int __inheritsched));
|
|
int _EXFUN(pthread_attr_getinheritsched,
|
|
(_CONST pthread_attr_t *__attr, int *__inheritsched));
|
|
int _EXFUN(pthread_attr_setschedpolicy,
|
|
(pthread_attr_t *__attr, int __policy));
|
|
int _EXFUN(pthread_attr_getschedpolicy,
|
|
(_CONST pthread_attr_t *__attr, int *__policy));
|
|
|
|
#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
|
|
|
|
int _EXFUN(pthread_attr_setschedparam,
|
|
(pthread_attr_t *__attr, _CONST struct sched_param *__param));
|
|
int _EXFUN(pthread_attr_getschedparam,
|
|
(_CONST pthread_attr_t *__attr, struct sched_param *__param));
|
|
|
|
#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
|
|
|
|
/* Dynamic Thread Scheduling Parameters Access, P1003.1c/Draft 10, p. 124 */
|
|
|
|
int _EXFUN(pthread_getschedparam,
|
|
(pthread_t __pthread, int *__policy, struct sched_param *__param));
|
|
int _EXFUN(pthread_setschedparam,
|
|
(pthread_t __pthread, int __policy, struct sched_param *__param));
|
|
|
|
#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
|
|
|
|
#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT)
|
|
|
|
/* Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128 */
|
|
|
|
int _EXFUN(pthread_mutexattr_setprotocol,
|
|
(pthread_mutexattr_t *__attr, int __protocol));
|
|
int _EXFUN(pthread_mutexattr_getprotocol,
|
|
(_CONST pthread_mutexattr_t *__attr, int *__protocol));
|
|
int _EXFUN(pthread_mutexattr_setprioceiling,
|
|
(pthread_mutexattr_t *__attr, int __prioceiling));
|
|
int _EXFUN(pthread_mutexattr_getprioceiling,
|
|
(_CONST pthread_mutexattr_t *__attr, int *__prioceiling));
|
|
|
|
#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */
|
|
|
|
#if defined(_POSIX_THREAD_PRIO_PROTECT)
|
|
|
|
/* Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131 */
|
|
|
|
int _EXFUN(pthread_mutex_setprioceiling,
|
|
(pthread_mutex_t *__mutex, int __prioceiling, int *__old_ceiling));
|
|
int _EXFUN(pthread_mutex_getprioceiling,
|
|
(pthread_mutex_t *__mutex, int *__prioceiling));
|
|
|
|
#endif /* _POSIX_THREAD_PRIO_PROTECT */
|
|
|
|
/* Thread Creation Attributes, P1003.1c/Draft 10, p, 140 */
|
|
|
|
int _EXFUN(pthread_attr_init, (pthread_attr_t *__attr));
|
|
int _EXFUN(pthread_attr_destroy, (pthread_attr_t *__attr));
|
|
int _EXFUN(pthread_attr_setstack, (pthread_attr_t *attr,
|
|
void *__stackaddr, size_t __stacksize));
|
|
int _EXFUN(pthread_attr_getstack, (_CONST pthread_attr_t *attr,
|
|
void **__stackaddr, size_t *__stacksize));
|
|
int _EXFUN(pthread_attr_getstacksize,
|
|
(_CONST pthread_attr_t *__attr, size_t *__stacksize));
|
|
int _EXFUN(pthread_attr_setstacksize,
|
|
(pthread_attr_t *__attr, size_t __stacksize));
|
|
int _EXFUN(pthread_attr_getstackaddr,
|
|
(_CONST pthread_attr_t *__attr, void **__stackaddr));
|
|
int _EXFUN(pthread_attr_setstackaddr,
|
|
(pthread_attr_t *__attr, void *__stackaddr));
|
|
int _EXFUN(pthread_attr_getdetachstate,
|
|
(_CONST pthread_attr_t *__attr, int *__detachstate));
|
|
int _EXFUN(pthread_attr_setdetachstate,
|
|
(pthread_attr_t *__attr, int __detachstate));
|
|
int _EXFUN(pthread_attr_getguardsize,
|
|
(_CONST pthread_attr_t *__attr, size_t *__guardsize));
|
|
int _EXFUN(pthread_attr_setguardsize,
|
|
(pthread_attr_t *__attr, size_t __guardsize));
|
|
|
|
/* POSIX thread APIs beyond the POSIX standard but provided
|
|
* in GNU/Linux. They may be provided by other OSes for
|
|
* compatibility.
|
|
*/
|
|
#if defined(__GNU_VISIBLE)
|
|
#if defined(__rtems__)
|
|
int _EXFUN(pthread_attr_setaffinity_np,
|
|
(pthread_attr_t *__attr, size_t __cpusetsize,
|
|
const cpu_set_t *__cpuset));
|
|
int _EXFUN(pthread_attr_getaffinity_np,
|
|
(const pthread_attr_t *__attr, size_t __cpusetsize,
|
|
cpu_set_t *__cpuset));
|
|
|
|
int _EXFUN(pthread_setaffinity_np,
|
|
(pthread_t __id, size_t __cpusetsize, const cpu_set_t *__cpuset));
|
|
int _EXFUN(pthread_getaffinity_np,
|
|
(const pthread_t __id, size_t __cpusetsize, cpu_set_t *__cpuset));
|
|
|
|
int _EXFUN(pthread_getattr_np,
|
|
(pthread_t __id, pthread_attr_t *__attr));
|
|
#endif /* defined(__rtems__) */
|
|
#endif /* defined(__GNU_VISIBLE) */
|
|
|
|
/* Thread Creation, P1003.1c/Draft 10, p. 144 */
|
|
|
|
int _EXFUN(pthread_create,
|
|
(pthread_t *__pthread, _CONST pthread_attr_t *__attr,
|
|
void *(*__start_routine)( void * ), void *__arg));
|
|
|
|
/* Wait for Thread Termination, P1003.1c/Draft 10, p. 147 */
|
|
|
|
int _EXFUN(pthread_join, (pthread_t __pthread, void **__value_ptr));
|
|
|
|
/* Detaching a Thread, P1003.1c/Draft 10, p. 149 */
|
|
|
|
int _EXFUN(pthread_detach, (pthread_t __pthread));
|
|
|
|
/* Thread Termination, p1003.1c/Draft 10, p. 150 */
|
|
|
|
void _EXFUN(pthread_exit, (void *__value_ptr));
|
|
|
|
/* Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX */
|
|
|
|
pthread_t _EXFUN(pthread_self, (void));
|
|
|
|
/* Compare Thread IDs, p1003.1c/Draft 10, p. 153 */
|
|
|
|
int _EXFUN(pthread_equal, (pthread_t __t1, pthread_t __t2));
|
|
|
|
/* Dynamic Package Initialization */
|
|
|
|
/* This is used to statically initialize a pthread_once_t. Example:
|
|
|
|
pthread_once_t once = PTHREAD_ONCE_INIT;
|
|
|
|
NOTE: This is named inconsistently -- it should be INITIALIZER. */
|
|
|
|
#define PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */
|
|
|
|
int _EXFUN(pthread_once,
|
|
(pthread_once_t *__once_control, void (*__init_routine)(void)));
|
|
|
|
/* Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163 */
|
|
|
|
int _EXFUN(pthread_key_create,
|
|
(pthread_key_t *__key, void (*__destructor)( void * )));
|
|
|
|
/* Thread-Specific Data Management, P1003.1c/Draft 10, p. 165 */
|
|
|
|
int _EXFUN(pthread_setspecific,
|
|
(pthread_key_t __key, _CONST void *__value));
|
|
void * _EXFUN(pthread_getspecific, (pthread_key_t __key));
|
|
|
|
/* Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167 */
|
|
|
|
int _EXFUN(pthread_key_delete, (pthread_key_t __key));
|
|
|
|
/* Execution of a Thread, P1003.1c/Draft 10, p. 181 */
|
|
|
|
#define PTHREAD_CANCEL_ENABLE 0
|
|
#define PTHREAD_CANCEL_DISABLE 1
|
|
|
|
#define PTHREAD_CANCEL_DEFERRED 0
|
|
#define PTHREAD_CANCEL_ASYNCHRONOUS 1
|
|
|
|
#define PTHREAD_CANCELED ((void *) -1)
|
|
|
|
int _EXFUN(pthread_cancel, (pthread_t __pthread));
|
|
|
|
/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */
|
|
|
|
int _EXFUN(pthread_setcancelstate, (int __state, int *__oldstate));
|
|
int _EXFUN(pthread_setcanceltype, (int __type, int *__oldtype));
|
|
void _EXFUN(pthread_testcancel, (void));
|
|
|
|
/* Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */
|
|
|
|
void _EXFUN(_pthread_cleanup_push,
|
|
(struct _pthread_cleanup_context *_context,
|
|
void (*_routine)(void *), void *_arg));
|
|
|
|
void _EXFUN(_pthread_cleanup_pop,
|
|
(struct _pthread_cleanup_context *_context,
|
|
int _execute));
|
|
|
|
/* It is intentional to open and close the scope in two different macros */
|
|
#define pthread_cleanup_push(_routine, _arg) \
|
|
do { \
|
|
struct _pthread_cleanup_context _pthread_clup_ctx; \
|
|
_pthread_cleanup_push(&_pthread_clup_ctx, (_routine), (_arg))
|
|
|
|
#define pthread_cleanup_pop(_execute) \
|
|
_pthread_cleanup_pop(&_pthread_clup_ctx, (_execute)); \
|
|
} while (0)
|
|
|
|
#if defined(_GNU_SOURCE)
|
|
void _EXFUN(_pthread_cleanup_push_defer,
|
|
(struct _pthread_cleanup_context *_context,
|
|
void (*_routine)(void *), void *_arg));
|
|
|
|
void _EXFUN(_pthread_cleanup_pop_restore,
|
|
(struct _pthread_cleanup_context *_context,
|
|
int _execute));
|
|
|
|
/* It is intentional to open and close the scope in two different macros */
|
|
#define pthread_cleanup_push_defer_np(_routine, _arg) \
|
|
do { \
|
|
struct _pthread_cleanup_context _pthread_clup_ctx; \
|
|
_pthread_cleanup_push_defer(&_pthread_clup_ctx, (_routine), (_arg))
|
|
|
|
#define pthread_cleanup_pop_restore_np(_execute) \
|
|
_pthread_cleanup_pop_restore(&_pthread_clup_ctx, (_execute)); \
|
|
} while (0)
|
|
#endif /* defined(_GNU_SOURCE) */
|
|
|
|
#if defined(_POSIX_THREAD_CPUTIME)
|
|
|
|
/* Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58 */
|
|
|
|
int _EXFUN(pthread_getcpuclockid,
|
|
(pthread_t __pthread_id, clockid_t *__clock_id));
|
|
|
|
#endif /* defined(_POSIX_THREAD_CPUTIME) */
|
|
|
|
|
|
#endif /* defined(_POSIX_THREADS) */
|
|
|
|
#if defined(_POSIX_BARRIERS)
|
|
|
|
int _EXFUN(pthread_barrierattr_init, (pthread_barrierattr_t *__attr));
|
|
int _EXFUN(pthread_barrierattr_destroy, (pthread_barrierattr_t *__attr));
|
|
int _EXFUN(pthread_barrierattr_getpshared,
|
|
(_CONST pthread_barrierattr_t *__attr, int *__pshared));
|
|
int _EXFUN(pthread_barrierattr_setpshared,
|
|
(pthread_barrierattr_t *__attr, int __pshared));
|
|
|
|
#define PTHREAD_BARRIER_SERIAL_THREAD -1
|
|
|
|
int _EXFUN(pthread_barrier_init,
|
|
(pthread_barrier_t *__barrier,
|
|
_CONST pthread_barrierattr_t *__attr, unsigned __count));
|
|
int _EXFUN(pthread_barrier_destroy, (pthread_barrier_t *__barrier));
|
|
int _EXFUN(pthread_barrier_wait,(pthread_barrier_t *__barrier));
|
|
|
|
#endif /* defined(_POSIX_BARRIERS) */
|
|
|
|
#if defined(_POSIX_SPIN_LOCKS)
|
|
|
|
int _EXFUN(pthread_spin_init,
|
|
(pthread_spinlock_t *__spinlock, int __pshared));
|
|
int _EXFUN(pthread_spin_destroy, (pthread_spinlock_t *__spinlock));
|
|
int _EXFUN(pthread_spin_lock, (pthread_spinlock_t *__spinlock));
|
|
int _EXFUN(pthread_spin_trylock, (pthread_spinlock_t *__spinlock));
|
|
int _EXFUN(pthread_spin_unlock, (pthread_spinlock_t *__spinlock));
|
|
|
|
#endif /* defined(_POSIX_SPIN_LOCKS) */
|
|
|
|
#if defined(_POSIX_READER_WRITER_LOCKS)
|
|
|
|
/* This is used to statically initialize a pthread_rwlock_t. Example:
|
|
|
|
pthread_mutex_t mutex = PTHREAD_RWLOCK_INITIALIZER;
|
|
*/
|
|
|
|
#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) 0xFFFFFFFF)
|
|
|
|
int _EXFUN(pthread_rwlockattr_init, (pthread_rwlockattr_t *__attr));
|
|
int _EXFUN(pthread_rwlockattr_destroy, (pthread_rwlockattr_t *__attr));
|
|
int _EXFUN(pthread_rwlockattr_getpshared,
|
|
(_CONST pthread_rwlockattr_t *__attr, int *__pshared));
|
|
int _EXFUN(pthread_rwlockattr_setpshared,
|
|
(pthread_rwlockattr_t *__attr, int __pshared));
|
|
|
|
int _EXFUN(pthread_rwlock_init,
|
|
(pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr));
|
|
int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_timedrdlock,
|
|
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
|
|
int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock));
|
|
int _EXFUN(pthread_rwlock_timedwrlock,
|
|
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
|
|
|
|
#endif /* defined(_POSIX_READER_WRITER_LOCKS) */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
/* end of include file */
|