]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/shmc/include/internal.h
Update
[l4.git] / l4 / pkg / shmc / include / internal.h
1 /*
2  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *               Alexander Warg <warg@os.inf.tu-dresden.de>
4  *     economic rights: Technische Universität Dresden (Germany)
5  * This file is part of TUD:OS and distributed under the terms of the
6  * GNU Lesser General Public License 2.1.
7  * Please see the COPYING-LGPL-2.1 file for details.
8  */
9 /**
10  * \internal
11  * \file
12  */
13 #pragma once
14
15 #ifndef __INCLUDED_FROM_L4SHMC_H__
16 #error Do not include l4/shm/internal.h directly, use l4/shm/shm.h!
17 #endif
18
19 #include <l4/sys/irq.h>
20 #include <l4/util/atomic.h>
21
22 L4_CV L4_INLINE long
23 l4shmc_attach(const char *shmc_name, l4shmc_area_t *shmarea)
24 {
25   return l4shmc_attach_to(shmc_name, 0, shmarea);
26 }
27
28 L4_CV L4_INLINE long
29 l4shmc_wait_any(l4shmc_signal_t **p)
30 {
31   return l4shmc_wait_any_to(L4_IPC_NEVER, p);
32 }
33
34 L4_CV L4_INLINE long
35 l4shmc_wait_any_try(l4shmc_signal_t **p)
36 {
37   return l4shmc_wait_any_to(L4_IPC_BOTH_TIMEOUT_0, p);
38 }
39
40 L4_CV L4_INLINE long
41 l4shmc_wait_signal_try(l4shmc_signal_t *s)
42 {
43   return l4shmc_wait_signal_to(s, L4_IPC_BOTH_TIMEOUT_0);
44 }
45
46 L4_CV L4_INLINE long
47 l4shmc_wait_signal(l4shmc_signal_t *s)
48 {
49   return l4shmc_wait_signal_to(s, L4_IPC_NEVER);
50 }
51
52 L4_CV L4_INLINE long
53 l4shmc_wait_chunk_try(l4shmc_chunk_t *p)
54 {
55   return l4shmc_wait_chunk_to(p, L4_IPC_BOTH_TIMEOUT_0);
56 }
57
58 L4_CV L4_INLINE long
59 l4shmc_wait_chunk(l4shmc_chunk_t *p)
60 {
61   return l4shmc_wait_chunk_to(p, L4_IPC_NEVER);
62 }
63
64 L4_CV L4_INLINE long
65 l4shmc_attach_signal(l4shmc_area_t *shmarea,
66                      const char *signal_name,
67                      l4_cap_idx_t thread,
68                      l4shmc_signal_t *signal)
69 {
70   return l4shmc_attach_signal_to(shmarea, signal_name, thread, 0, signal);
71 }
72
73 L4_CV L4_INLINE long
74 l4shmc_get_signal(l4shmc_area_t *shmarea,
75                   const char *signal_name,
76                   l4shmc_signal_t *signal)
77 {
78   return l4shmc_get_signal_to(shmarea, signal_name, 0, signal);
79 }
80
81 L4_CV L4_INLINE long
82 l4shmc_get_chunk(l4shmc_area_t *shmarea,
83                  const char *chunk_name,
84                  l4shmc_chunk_t *chunk)
85 {
86   return l4shmc_get_chunk_to(shmarea, chunk_name, 0, chunk);
87 }
88
89
90 L4_CV L4_INLINE long
91 l4shmc_chunk_ready(l4shmc_chunk_t *chunk, l4_umword_t size)
92 {
93   chunk->_chunk->_size = size;
94   __sync_synchronize();
95   chunk->_chunk->_status = L4SHMC_CHUNK_READY;
96   return L4_EOK;
97 }
98
99 L4_CV L4_INLINE long
100 l4shmc_trigger(l4shmc_signal_t *s)
101 {
102   return l4_ipc_error(l4_irq_trigger(s->_sigcap), l4_utcb());
103 }
104
105 L4_CV L4_INLINE long
106 l4shmc_chunk_ready_sig(l4shmc_chunk_t *chunk, l4_umword_t size)
107 {
108   l4shmc_chunk_ready(chunk, size);
109   return l4shmc_trigger(chunk->_sig);
110 }
111
112 L4_CV L4_INLINE void *
113 l4shmc_chunk_ptr(l4shmc_chunk_t *p)
114 {
115   return (void *)(((l4shmc_chunk_desc_t *)(p->_chunk->_offset +
116                    (l4_addr_t)p->_shm->_local_addr))->payload);
117 }
118
119 L4_CV L4_INLINE l4shmc_signal_t *
120 l4shmc_chunk_signal(l4shmc_chunk_t *chunk)
121 {
122   return chunk->_sig;
123 }
124
125 L4_CV L4_INLINE l4_cap_idx_t
126 l4shmc_signal_cap(l4shmc_signal_t *signal)
127 {
128   return signal->_sigcap;
129 }
130
131 L4_CV L4_INLINE long
132 l4shmc_chunk_size(l4shmc_chunk_t *p)
133 {
134   l4_umword_t s = p->_chunk->_size;
135   if (s > p->_capacity)
136     return -L4_EIO;
137   return s;
138 }
139
140 L4_CV L4_INLINE long
141 l4shmc_chunk_capacity(l4shmc_chunk_t *p)
142 {
143   return p->_capacity;
144 }
145
146 L4_CV L4_INLINE long
147 l4shmc_chunk_try_to_take(l4shmc_chunk_t *chunk)
148 {
149   if (!l4util_cmpxchg(&chunk->_chunk->_status,
150                       L4SHMC_CHUNK_CLEAR, L4SHMC_CHUNK_BUSY))
151     return -L4_EPERM;
152   return L4_EOK;
153 }
154
155 L4_CV L4_INLINE long
156 l4shmc_chunk_consumed(l4shmc_chunk_t *chunk)
157 {
158   chunk->_chunk->_status = L4SHMC_CHUNK_CLEAR;
159   return L4_EOK;
160 }
161
162
163 L4_CV L4_INLINE long
164 l4shmc_is_chunk_ready(l4shmc_chunk_t *chunk)
165 {
166   return chunk->_chunk->_status == L4SHMC_CHUNK_READY;
167 }
168
169 L4_CV L4_INLINE long
170 l4shmc_is_chunk_clear(l4shmc_chunk_t *chunk)
171 {
172   return chunk->_chunk->_status == L4SHMC_CHUNK_CLEAR;
173 }
174
175 L4_CV L4_INLINE long
176 l4shmc_check_magic(l4shmc_chunk_t *chunk)
177 {
178   return chunk->_chunk->_magic == L4SHMC_CHUNK_MAGIC;
179 }
180
181 L4_CV L4_INLINE long
182 l4shmc_area_size(l4shmc_area_t *shmarea)
183 {
184   return l4re_ds_size(shmarea->_shm_ds);
185 }