master
1#include "pthread_impl.h"
2
3#ifndef __wasilibc_unmodified_upstream
4#include <common/clock.h>
5#endif
6
7int pthread_attr_getdetachstate(const pthread_attr_t *a, int *state)
8{
9 *state = a->_a_detach;
10 return 0;
11}
12int pthread_attr_getguardsize(const pthread_attr_t *restrict a, size_t *restrict size)
13{
14 *size = a->_a_guardsize;
15 return 0;
16}
17
18#ifdef __wasilibc_unmodified_upstream /* WASI has no CPU scheduling support. */
19int pthread_attr_getinheritsched(const pthread_attr_t *restrict a, int *restrict inherit)
20{
21 *inherit = a->_a_sched;
22 return 0;
23}
24
25int pthread_attr_getschedparam(const pthread_attr_t *restrict a, struct sched_param *restrict param)
26{
27 param->sched_priority = a->_a_prio;
28 return 0;
29}
30
31int pthread_attr_getschedpolicy(const pthread_attr_t *restrict a, int *restrict policy)
32{
33 *policy = a->_a_policy;
34 return 0;
35}
36
37int pthread_attr_getscope(const pthread_attr_t *restrict a, int *restrict scope)
38{
39 *scope = PTHREAD_SCOPE_SYSTEM;
40 return 0;
41}
42#else
43int pthread_attr_getschedparam(const pthread_attr_t *restrict a, struct sched_param *restrict param)
44{
45 param->sched_priority = 0;
46 return 0;
47}
48#endif
49
50int pthread_attr_getstack(const pthread_attr_t *restrict a, void **restrict addr, size_t *restrict size)
51{
52 if (!a->_a_stackaddr)
53 return EINVAL;
54 *size = a->_a_stacksize;
55 *addr = (void *)(a->_a_stackaddr - *size);
56 return 0;
57}
58
59int pthread_attr_getstacksize(const pthread_attr_t *restrict a, size_t *restrict size)
60{
61 *size = a->_a_stacksize;
62 return 0;
63}
64
65int pthread_barrierattr_getpshared(const pthread_barrierattr_t *restrict a, int *restrict pshared)
66{
67 *pshared = !!a->__attr;
68 return 0;
69}
70
71#ifdef __wasilibc_unmodified_upstream /* Forward declaration of WASI's `__clockid` type. */
72int pthread_condattr_getclock(const pthread_condattr_t *restrict a, clockid_t *restrict clk)
73{
74 *clk = a->__attr & 0x7fffffff;
75 return 0;
76}
77#else
78int pthread_condattr_getclock(const pthread_condattr_t *restrict a, clockid_t *restrict clk)
79{
80 if (a->__attr & 0x7fffffff == __WASI_CLOCKID_REALTIME)
81 *clk = CLOCK_REALTIME;
82 if (a->__attr & 0x7fffffff == __WASI_CLOCKID_MONOTONIC)
83 *clk = CLOCK_MONOTONIC;
84 return 0;
85}
86#endif
87
88int pthread_condattr_getpshared(const pthread_condattr_t *restrict a, int *restrict pshared)
89{
90 *pshared = a->__attr>>31;
91 return 0;
92}
93
94int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *restrict a, int *restrict protocol)
95{
96 *protocol = a->__attr / 8U % 2;
97 return 0;
98}
99int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict a, int *restrict pshared)
100{
101 *pshared = a->__attr / 128U % 2;
102 return 0;
103}
104
105int pthread_mutexattr_getrobust(const pthread_mutexattr_t *restrict a, int *restrict robust)
106{
107 *robust = a->__attr / 4U % 2;
108 return 0;
109}
110
111int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict a, int *restrict type)
112{
113 *type = a->__attr & 3;
114 return 0;
115}
116
117int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict a, int *restrict pshared)
118{
119 *pshared = a->__attr[0];
120 return 0;
121}