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.
15 #ifndef __INCLUDED_FROM_L4SHMC_H__
16 #error Do not include l4/shm/internal.h directly, use l4/shm/shm.h!
19 #include <l4/sys/irq.h>
20 #include <l4/util/atomic.h>
23 l4shmc_attach(const char *shmc_name, l4shmc_area_t *shmarea)
25 return l4shmc_attach_to(shmc_name, 0, shmarea);
29 l4shmc_wait_any(l4shmc_signal_t **p)
31 return l4shmc_wait_any_to(L4_IPC_NEVER, p);
35 l4shmc_wait_any_try(l4shmc_signal_t **p)
37 return l4shmc_wait_any_to(L4_IPC_BOTH_TIMEOUT_0, p);
41 l4shmc_wait_signal_try(l4shmc_signal_t *s)
43 return l4shmc_wait_signal_to(s, L4_IPC_BOTH_TIMEOUT_0);
47 l4shmc_wait_signal(l4shmc_signal_t *s)
49 return l4shmc_wait_signal_to(s, L4_IPC_NEVER);
53 l4shmc_wait_chunk_try(l4shmc_chunk_t *p)
55 return l4shmc_wait_chunk_to(p, L4_IPC_BOTH_TIMEOUT_0);
59 l4shmc_wait_chunk(l4shmc_chunk_t *p)
61 return l4shmc_wait_chunk_to(p, L4_IPC_NEVER);
65 l4shmc_attach_signal(l4shmc_area_t *shmarea,
66 const char *signal_name,
68 l4shmc_signal_t *signal)
70 return l4shmc_attach_signal_to(shmarea, signal_name, thread, 0, signal);
74 l4shmc_get_signal(l4shmc_area_t *shmarea,
75 const char *signal_name,
76 l4shmc_signal_t *signal)
78 return l4shmc_get_signal_to(shmarea, signal_name, 0, signal);
82 l4shmc_get_chunk(l4shmc_area_t *shmarea,
83 const char *chunk_name,
84 l4shmc_chunk_t *chunk)
86 return l4shmc_get_chunk_to(shmarea, chunk_name, 0, chunk);
91 l4shmc_chunk_ready(l4shmc_chunk_t *chunk, l4_umword_t size)
93 chunk->_chunk->_size = size;
95 chunk->_chunk->_status = L4SHMC_CHUNK_READY;
100 l4shmc_trigger(l4shmc_signal_t *s)
102 return l4_ipc_error(l4_irq_trigger(s->_sigcap), l4_utcb());
106 l4shmc_chunk_ready_sig(l4shmc_chunk_t *chunk, l4_umword_t size)
108 l4shmc_chunk_ready(chunk, size);
109 return l4shmc_trigger(chunk->_sig);
112 L4_CV L4_INLINE void *
113 l4shmc_chunk_ptr(l4shmc_chunk_t *p)
115 return (void *)(((l4shmc_chunk_desc_t *)(p->_chunk->_offset +
116 (l4_addr_t)p->_shm->_local_addr))->payload);
119 L4_CV L4_INLINE l4shmc_signal_t *
120 l4shmc_chunk_signal(l4shmc_chunk_t *chunk)
125 L4_CV L4_INLINE l4_cap_idx_t
126 l4shmc_signal_cap(l4shmc_signal_t *signal)
128 return signal->_sigcap;
132 l4shmc_chunk_size(l4shmc_chunk_t *p)
134 l4_umword_t s = p->_chunk->_size;
135 if (s > p->_capacity)
141 l4shmc_chunk_capacity(l4shmc_chunk_t *p)
147 l4shmc_chunk_try_to_take(l4shmc_chunk_t *chunk)
149 if (!l4util_cmpxchg(&chunk->_chunk->_status,
150 L4SHMC_CHUNK_CLEAR, L4SHMC_CHUNK_BUSY))
156 l4shmc_chunk_consumed(l4shmc_chunk_t *chunk)
158 chunk->_chunk->_status = L4SHMC_CHUNK_CLEAR;
164 l4shmc_is_chunk_ready(l4shmc_chunk_t *chunk)
166 return chunk->_chunk->_status == L4SHMC_CHUNK_READY;
170 l4shmc_is_chunk_clear(l4shmc_chunk_t *chunk)
172 return chunk->_chunk->_status == L4SHMC_CHUNK_CLEAR;
176 l4shmc_check_magic(l4shmc_chunk_t *chunk)
178 return chunk->_chunk->_magic == L4SHMC_CHUNK_MAGIC;
182 l4shmc_area_size(l4shmc_area_t *shmarea)
184 return l4re_ds_size(shmarea->_shm_ds);