PatchworkOS
Loading...
Searching...
No Matches
thrd_join.c
Go to the documentation of this file.
1
#include <
stdatomic.h
>
2
#include <
stdbool.h
>
3
#include <
stdio.h
>
4
#include <
sys/proc.h
>
5
#include <
threads.h
>
6
7
#include "
user/common/syscalls.h
"
8
#include "
user/common/thread.h
"
9
10
int
thrd_join
(
thrd_t
thr,
int
* res)
11
{
12
_thread_t
* thread =
_thread_get
(thr.
id
);
13
if
(thread ==
NULL
)
14
{
15
return
thrd_error
;
16
}
17
18
uint64_t
expected =
_THREAD_ATTACHED
;
19
if
(!
atomic_compare_exchange_strong
(&thread->
state
, &expected,
_THREAD_JOINING
))
20
{
21
if
(expected ==
_THREAD_DETACHED
)
22
{
23
return
thrd_error
;
24
}
25
}
26
27
uint64_t
state;
28
while
((state =
atomic_load
(&thread->
state
)) !=
_THREAD_EXITED
)
29
{
30
futex
(&thread->
state
, state,
FUTEX_WAIT
,
CLOCKS_NEVER
);
31
}
32
33
if
(res !=
NULL
)
34
{
35
*res = thread->
result
;
36
}
37
38
_thread_free
(thread);
39
return
thrd_success
;
40
}
CLOCKS_NEVER
#define CLOCKS_NEVER
Definition
clock_t.h:16
futex
uint64_t futex(atomic_uint64_t *addr, uint64_t val, futex_op_t op, clock_t timeout)
System call for fast user space mutual exclusion.
Definition
futex.c:6
FUTEX_WAIT
@ FUTEX_WAIT
The futex operating for waiting until the value pointed to by addr is not equal to val.
Definition
proc.h:227
NULL
#define NULL
Pointer error value.
Definition
NULL.h:23
_thread_get
_thread_t * _thread_get(tid_t id)
Definition
thread.c:72
_thread_free
void _thread_free(_thread_t *thread)
Definition
thread.c:61
proc.h
syscalls.h
thread.h
_THREAD_EXITED
#define _THREAD_EXITED
Definition
thread.h:21
_THREAD_JOINING
#define _THREAD_JOINING
Definition
thread.h:20
_THREAD_DETACHED
#define _THREAD_DETACHED
Definition
thread.h:19
_THREAD_ATTACHED
#define _THREAD_ATTACHED
Definition
thread.h:18
stdatomic.h
atomic_compare_exchange_strong
#define atomic_compare_exchange_strong(object, expected, desired)
Definition
stdatomic.h:278
atomic_load
#define atomic_load(object)
Definition
stdatomic.h:288
stdbool.h
uint64_t
__UINT64_TYPE__ uint64_t
Definition
stdint.h:17
stdio.h
_thread_t
Definition
thread.h:24
_thread_t::result
int result
Definition
thread.h:28
_thread_t::state
atomic_uint64_t state
Definition
thread.h:26
thrd_t
Definition
threads.h:37
thrd_t::id
tid_t id
Definition
threads.h:38
thrd_join
int thrd_join(thrd_t thr, int *res)
Definition
thrd_join.c:10
threads.h
thrd_success
@ thrd_success
Definition
threads.h:74
thrd_error
@ thrd_error
Definition
threads.h:76
src
libstd
user
functions
thread
thrd_join.c
Generated by
1.9.8