Changes for nameservice. Use RPC client for NS functionality.
[barrelfish] / lib / posixcompat / semaphore.c
1 /*
2  * Copyright (c) 2011, ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #include <stdio.h>
11 #include <errno.h>
12 #include <semaphore.h>
13 #include <assert.h>
14 #include <barrelfish/barrelfish.h>
15 #include <string.h>
16 #include "posixcompat.h"
17
18 #include <if/dist2_defs.h>
19 #include <if/dist2_rpcclient_defs.h>
20
21 int sem_init(sem_t *sem, int pshared, unsigned int value)
22 {
23     POSIXCOMPAT_DEBUG("sem_init(%p, %d, %u)\n", sem, pshared, value);
24
25     memset(sem, 0, sizeof(sem_t));
26
27     if(pshared != 0) {
28         sem->pshared = 1;
29         /* fprintf(stderr, "sem_init called with pshared != 0. Ignoring.\n"); */
30
31                 POSIXCOMPAT_DEBUG("%d: sem_init(%p, %d, %u)\n", disp_get_domain_id(), sem, pshared, value);
32
33         struct dist2_rpc_client *r = get_nameservice_rpc_client();
34         assert(r != NULL);
35
36         errval_t err, reterr;
37         err = r->vtbl.sem_new(r, value, &sem->id, &reterr);
38         if (err_is_fail(err)) {
39             USER_PANIC_ERR(err, "sem_new");
40         }
41         if (err_is_fail(reterr)) {
42             USER_PANIC_ERR(reterr, "sem_new reterr");
43         }
44     } else {
45         sem->pshared = 0;
46         thread_sem_init(&sem->thread_sem, value);
47     }
48     return 0;
49 }
50
51 int sem_destroy(sem_t *sem)
52 {
53     POSIXCOMPAT_DEBUG("sem_destroy(%p)\n", sem);
54     assert(!"NYI");
55     // Nothing needed
56     return 0;
57 }
58
59 int sem_wait(sem_t *sem)
60 {
61         POSIXCOMPAT_DEBUG("%d: sem_wait(%p, %u):\n %p %p %p %p\n", disp_get_domain_id(), sem, sem->id,
62          __builtin_return_address(0),
63          __builtin_return_address(1),
64          __builtin_return_address(2),
65      __builtin_return_address(3));
66
67     if(!sem->pshared) {
68         thread_sem_wait(&sem->thread_sem);
69     } else {
70         struct dist2_rpc_client *r = get_nameservice_rpc_client();
71         assert(r != NULL);
72
73         errval_t err;
74         err = r->vtbl.sem_wait(r, sem->id);
75         if (err_is_fail(err)) {
76             USER_PANIC_ERR(err, "sem_wait");
77         }
78     }
79
80     return 0;
81 }
82
83 int sem_trywait(sem_t *sem)
84 {
85         POSIXCOMPAT_DEBUG("%d: sem_trywait(%p, %u)\n", disp_get_domain_id(), sem, sem->id);
86
87     if(!sem->pshared) {
88         if(thread_sem_trywait(&sem->thread_sem)) {
89             return 0;
90         } else {
91             errno = EAGAIN;
92             return -1;
93         }
94     } else {
95         struct dist2_rpc_client *r = get_nameservice_rpc_client();
96         assert(r != NULL);
97
98         errval_t err;
99         bool success;
100         err = r->vtbl.sem_trywait(r, sem->id, &success);
101         if (err_is_fail(err)) {
102             USER_PANIC_ERR(err, "sem_wait");
103         }
104
105         if(success) {
106                         POSIXCOMPAT_DEBUG("%d: sem_trywait(%p, %u) success!\n", disp_get_domain_id(), sem, sem->id);
107             return 0;
108         } else {
109                         POSIXCOMPAT_DEBUG("%d: sem_trywait(%p, %u) no success\n", disp_get_domain_id(), sem, sem->id);
110             errno = EAGAIN;
111             return -1;
112         }
113     }
114
115     assert(!"Should not reach here");
116 }
117
118 int sem_post(sem_t *sem)
119 {
120         POSIXCOMPAT_DEBUG("%d: sem_post(%p, %u): %p %p %p %p\n", disp_get_domain_id(), sem, sem->id,
121          __builtin_return_address(0),
122          __builtin_return_address(1),
123          __builtin_return_address(2),
124      __builtin_return_address(3));
125
126     if(!sem->pshared) {
127         thread_sem_post(&sem->thread_sem);
128     } else {
129         struct dist2_rpc_client *r = get_nameservice_rpc_client();
130         assert(r != NULL);
131
132         errval_t err;
133         err = r->vtbl.sem_post(r, sem->id);
134         if (err_is_fail(err)) {
135             USER_PANIC_ERR(err, "sem_post");
136         }
137     }
138
139     return 0;
140 }