LF OS
Hobby operating system for amd64 with high ambitions
Loading...
Searching...
No Matches
condvar.c
Go to the documentation of this file.
1#include <condvar.h>
2#include <tpa.h>
3#include <vm.h>
4#include <log.h>
5#include <scheduler.h>
6#include <unused_param.h>
7
12
15
16void init_condvar(void) {
17 condvars = tpa_new(&kernel_alloc, sizeof(struct condvar_data), 4080, 0);
18}
19
21 if(!next_condvar) {
22 *e = 12; // ENOMEM TODO: errno.h
23 logw("condvar", "CondVar namespace overflow!");
24 return;
25 }
26
27 struct condvar_data data = {
28 .wait_count = 0,
29 };
30
32
33 logd("condvar", "Created new condvar %u", next_condvar);
34 *cv = next_condvar++;
35 *e = 0;
36}
37
39 struct condvar_data* data = tpa_get(condvars, condvar);
40
41 if(!data) {
42 *e = 22; // EINVAL
43 return;
44 }
45 else if(data->wait_count) {
46 *e = 16; // EBUSY
47 return;
48 }
49
51 logd("condvar", "Created new condvar %u", next_condvar);
52 *e = 0;
53}
54
56 struct condvar_data* data = tpa_get(condvars, condvar);
57
58 if(!data) {
59 *e = 22; // EINVAL
60 return;
61 }
62 else if(data->wait_count) {
63 *e = 0;
64
65 union wait_data wd;
66 wd.condvar = condvar;
68 //XXX: update wait_count
69 }
70}
71
74
75 struct condvar_data* data = tpa_get(condvars, condvar);
76
77 if(!data) {
78 *e = 22; // EINVAL
79 return;
80 }
81
82 *e = 0;
83 ++data->wait_count;
84
85 union wait_data wd;
86 wd.condvar = condvar;
88}
allocator_t kernel_alloc
Definition vm.c:737
unsigned long uint64_t
Definition arch.h:14
void sc_handle_locking_create_condvar(uint64_t *cv, uint64_t *e)
Definition condvar.c:20
void sc_handle_locking_signal_condvar(uint64_t condvar, uint64_t amount, uint64_t *e)
Definition condvar.c:55
void init_condvar(void)
Definition condvar.c:16
static uint64_t next_condvar
Definition condvar.c:14
void sc_handle_locking_destroy_condvar(uint64_t condvar, uint64_t *e)
Definition condvar.c:38
void sc_handle_locking_wait_condvar(uint64_t condvar, uint64_t timeout, uint64_t *e)
Definition condvar.c:72
static tpa_t * condvars
Definition condvar.c:13
uint64_t wait_count
Number of processes currently waiting on this condvar.
Definition condvar.c:10
#define logd(component, fmt,...)
Definition log.h:28
#define logw(component, fmt,...)
Definition log.h:44
void scheduler_wait_for(pid_t pid, enum wait_reason reason, union wait_data data)
Definition scheduler.c:353
void scheduler_waitable_done(enum wait_reason reason, union wait_data data, size_t max_amount)
Definition scheduler.c:363
condvar_t condvar
Definition scheduler.h:27
@ wait_reason_condvar
Definition scheduler.h:15
static uint64_t timeout
Definition syscalls.h:280
* condvar
Definition syscalls.h:236
static uint64_t amount
Definition syscalls.h:263
tpa_t * tpa_new(allocator_t *alloc, uint64_t entry_size, uint64_t page_size, tpa_t *tpa)
Definition tpa.c:48
void * tpa_get(tpa_t *tpa, uint64_t idx)
Definition tpa.c:144
void tpa_set(tpa_t *tpa, uint64_t idx, void *data)
Definition tpa.c:174
Header of a TPA.
Definition tpa.c:34
#define UNUSED_PARAM(v)
Definition unused_param.h:5