1#include <stdio.h>
2#include <assert.h>
3#include <barrelfish/barrelfish.h>
4#include <barrelfish/spawn_client.h>
5#include <semaphore.h>
6
7int main(int argc, char *argv[])
8{
9    sem_t sem;
10    debug_printf("semtest start");
11    if(argc == 2) {
12        // Initializer
13        sem_init(&sem, 1, 0);
14        assert(sem.id == 1);
15
16        for(int i = 0; i < 10; i++) {
17            errval_t err;
18            char *args[5];
19            args[0] = "program";
20            args[1] = NULL;
21            err = spawn_program(disp_get_core_id(), "/x86_64/sbin/semtest",
22                                args, NULL, SPAWN_FLAGS_NEW_DOMAIN, NULL);
23            assert(err_is_ok(err));
24        }
25    } else {
26        sem.id = 1;
27        sem.pshared = 1;
28    }
29
30    // Worker
31    for(;;) {
32        if(disp_get_domain_id() % 1 == 0) {
33            printf("%"PRIuDOMAINID": post\n", disp_get_domain_id());
34            sem_post(&sem);
35        }
36        printf("%"PRIuDOMAINID": trywait\n", disp_get_domain_id());
37        if(sem_trywait(&sem) == -1) {
38            printf("%"PRIuDOMAINID": would block\n", disp_get_domain_id());
39            printf("%"PRIuDOMAINID": wait\n", disp_get_domain_id());
40            sem_wait(&sem);
41        } else {
42            printf("%"PRIuDOMAINID": works\n", disp_get_domain_id());
43        }
44
45        if(disp_get_domain_id() % 1 == 1) {
46            printf("%"PRIuDOMAINID": post\n", disp_get_domain_id());
47            sem_post(&sem);
48        }
49    }
50
51    return 0;
52}
53