PatchworkOS  966e257
A non-POSIX operating system.
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#include <time.h>
7
10
11int thrd_join(thrd_t thr, int* res)
12{
13 _thread_t* thread = _thread_get(thr.id);
14 if (thread == NULL)
15 {
16 return thrd_error;
17 }
18
19 uint64_t expected = _THREAD_ATTACHED;
20 if (!atomic_compare_exchange_strong(&thread->state, &expected, _THREAD_JOINING))
21 {
22 if (expected == _THREAD_DETACHED)
23 {
24 return thrd_error;
25 }
26 }
27
28 while (true)
29 {
30 uint64_t state = atomic_load(&thread->state);
31 if (state == _THREAD_EXITED)
32 {
33 break;
34 }
35
36 futex(&thread->state, state, FUTEX_WAIT, CLOCKS_NEVER);
37 }
38
39 if (res != NULL)
40 {
41 *res = thread->result;
42 }
43
44 _thread_free(thread);
45 return thrd_success;
46}
#define CLOCKS_NEVER
Definition clock_t.h:16
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
Wait until the timeout expires or the futex value changes.
Definition proc.h:193
#define NULL
Pointer error value.
Definition NULL.h:23
_thread_t * _thread_get(tid_t id)
Definition thread.c:129
void _thread_free(_thread_t *thread)
Definition thread.c:120
#define _THREAD_EXITED
Definition thread.h:20
#define _THREAD_JOINING
Definition thread.h:19
#define _THREAD_DETACHED
Definition thread.h:18
#define _THREAD_ATTACHED
Definition thread.h:17
#define atomic_compare_exchange_strong(object, expected, desired)
Definition stdatomic.h:278
#define atomic_load(object)
Definition stdatomic.h:288
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
int result
Definition thread.h:26
atomic_uint64_t state
Definition thread.h:24
tid_t id
Definition threads.h:39
int thrd_join(thrd_t thr, int *res)
Definition thrd_join.c:11
@ thrd_success
Definition threads.h:74
@ thrd_error
Definition threads.h:76