7
7
#ifndef __PTHREAD_H__
8
8
#define __PTHREAD_H__
9
9
10
+ #include <kernel.h>
10
11
#ifdef CONFIG_NEWLIB_LIBC
11
12
#include <time.h>
12
13
#else
@@ -20,6 +21,46 @@ struct timespec {
20
21
#endif /* CONFIG_NEWLIB_LIBC */
21
22
22
23
#include "sys/types.h"
24
+ #include "sched.h"
25
+
26
+ enum pthread_state {
27
+ /* The thread is running and joinable. */
28
+ PTHREAD_JOINABLE = 0 ,
29
+ /* The thread is running and detached. */
30
+ PTHREAD_DETACHED ,
31
+ /* A joinable thread exited and its return code is available. */
32
+ PTHREAD_EXITED ,
33
+ /* The thread structure is unallocated and available for reuse. */
34
+ PTHREAD_TERMINATED
35
+ };
36
+
37
+ struct posix_thread {
38
+ struct k_thread thread ;
39
+
40
+ /* Exit status */
41
+ void * retval ;
42
+
43
+ /* Pthread cancellation */
44
+ int cancel_state ;
45
+ int cancel_pending ;
46
+ struct k_sem cancel_lock_sem ;
47
+ pthread_mutex_t cancel_lock ;
48
+
49
+ /* Pthread State */
50
+ enum pthread_state state ;
51
+ pthread_mutex_t state_lock ;
52
+ struct k_sem state_lock_sem ;
53
+ pthread_cond_t state_cond ;
54
+ };
55
+
56
+ /* Pthread detach/joinable */
57
+ #define PTHREAD_CREATE_JOINABLE 0
58
+ #define PTHREAD_CREATE_DETACHED 1
59
+
60
+ /* Pthread cancellation */
61
+ #define _PTHREAD_CANCEL_POS 0
62
+ #define PTHREAD_CANCEL_ENABLE (0 << _PTHREAD_CANCEL_POS)
63
+ #define PTHREAD_CANCEL_DISABLE (1 << _PTHREAD_CANCEL_POS)
23
64
24
65
static inline s32_t _ts_to_ms (const struct timespec * to )
25
66
{
@@ -359,4 +400,57 @@ int pthread_barrierattr_getpshared(const pthread_barrierattr_t *, int *);
359
400
int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
360
401
*/
361
402
403
+ /* Base Pthread related APIs */
404
+
405
+ /**
406
+ * @brief Obtain ID of the calling thread.
407
+ *
408
+ * The results of calling this API from threads not created with
409
+ * pthread_create() are undefined.
410
+ *
411
+ * See IEEE 1003.1
412
+ */
413
+ static inline pthread_t pthread_self (void )
414
+ {
415
+ return (pthread_t )k_current_get ();
416
+ }
417
+
418
+
419
+ /**
420
+ * @brief Compare thread IDs.
421
+ *
422
+ * See IEEE 1003.1
423
+ */
424
+ static inline int pthread_equal (pthread_t pt1 , pthread_t pt2 )
425
+ {
426
+ return (pt1 == pt2 );
427
+ }
428
+
429
+ int pthread_attr_getstacksize (const pthread_attr_t * attr , size_t * stacksize );
430
+ int pthread_attr_setschedpolicy (pthread_attr_t * attr , int policy );
431
+ int pthread_attr_getschedpolicy (const pthread_attr_t * attr , int * policy );
432
+ int pthread_attr_setdetachstate (pthread_attr_t * attr , int detachstate );
433
+ int pthread_attr_getdetachstate (const pthread_attr_t * attr , int * detachstate );
434
+ int pthread_attr_init (pthread_attr_t * attr );
435
+ int pthread_attr_destroy (pthread_attr_t * attr );
436
+ int pthread_attr_getschedparam (const pthread_attr_t * attr ,
437
+ struct sched_param * schedparam );
438
+ int pthread_getschedparam (pthread_t pthread , int * policy ,
439
+ struct sched_param * param );
440
+ int pthread_attr_getstack (const pthread_attr_t * attr ,
441
+ void * * stackaddr , size_t * stacksize );
442
+ int pthread_attr_setstack (pthread_attr_t * attr , void * stackaddr ,
443
+ size_t stacksize );
444
+ void pthread_exit (void * retval );
445
+ int pthread_join (pthread_t thread , void * * status );
446
+ int pthread_cancel (pthread_t pthread );
447
+ int pthread_detach (pthread_t thread );
448
+ int pthread_create (pthread_t * newthread , const pthread_attr_t * attr ,
449
+ void * (* threadroutine )(void * ), void * arg );
450
+ int pthread_setcancelstate (int state , int * oldstate );
451
+ int pthread_attr_setschedparam (pthread_attr_t * attr ,
452
+ const struct sched_param * schedparam );
453
+ int pthread_setschedparam (pthread_t pthread , int policy ,
454
+ const struct sched_param * param );
455
+
362
456
#endif /* __PTHREAD_H__ */
0 commit comments