The Pedigree Project 0.1
sys.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
25/*
26 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without modification,
30 * are permitted provided that the following conditions are met:
31 *
32 * 1. Redistributions of source code must retain the above copyright notice,
33 * this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright notice,
35 * this list of conditions and the following disclaimer in the documentation
36 * and/or other materials provided with the distribution.
37 * 3. The name of the author may not be used to endorse or promote products
38 * derived from this software without specific prior written permission.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
41 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
42 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
43 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
44 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
45 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
46 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
48 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
49 * OF SUCH DAMAGE.
50 *
51 * This file is part of the lwIP TCP/IP stack.
52 *
53 * Author: Adam Dunkels <adam@sics.se>
54 */
55
56#ifndef LWIP_HDR_SYS_H
57#define LWIP_HDR_SYS_H
58
59#include "lwip/opt.h"
60
61#ifdef __cplusplus
62extern "C" {
63#endif
64
65#if NO_SYS
66
67/* For a totally minimal and standalone system, we provide null
68 definitions of the sys_ functions. */
69typedef u8_t sys_sem_t;
70typedef u8_t sys_mutex_t;
71typedef u8_t sys_mbox_t;
72
73#define sys_sem_new(s, c) ERR_OK
74#define sys_sem_signal(s)
75#define sys_sem_wait(s)
76#define sys_arch_sem_wait(s,t)
77#define sys_sem_free(s)
78#define sys_sem_valid(s) 0
79#define sys_sem_valid_val(s) 0
80#define sys_sem_set_invalid(s)
81#define sys_sem_set_invalid_val(s)
82#define sys_mutex_new(mu) ERR_OK
83#define sys_mutex_lock(mu)
84#define sys_mutex_unlock(mu)
85#define sys_mutex_free(mu)
86#define sys_mutex_valid(mu) 0
87#define sys_mutex_set_invalid(mu)
88#define sys_mbox_new(m, s) ERR_OK
89#define sys_mbox_fetch(m,d)
90#define sys_mbox_tryfetch(m,d)
91#define sys_mbox_post(m,d)
92#define sys_mbox_trypost(m,d)
93#define sys_mbox_free(m)
94#define sys_mbox_valid(m)
95#define sys_mbox_valid_val(m)
96#define sys_mbox_set_invalid(m)
97#define sys_mbox_set_invalid_val(m)
98
99#define sys_thread_new(n,t,a,s,p)
100
101#define sys_msleep(t)
102
103#else /* NO_SYS */
104
106#define SYS_ARCH_TIMEOUT 0xffffffffUL
107
111#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT
112
113#include "lwip/err.h"
114#include "arch/sys_arch.h"
115
117typedef void (*lwip_thread_fn)(void *arg);
118
119/* Function prototypes for functions to be implemented by platform ports
120 (in sys_arch.c) */
121
122/* Mutex functions: */
123
126#ifndef LWIP_COMPAT_MUTEX
127#define LWIP_COMPAT_MUTEX 0
128#endif
129
130#if LWIP_COMPAT_MUTEX
131/* for old ports that don't have mutexes: define them to binary semaphores */
132#define sys_mutex_t sys_sem_t
133#define sys_mutex_new(mutex) sys_sem_new(mutex, 1)
134#define sys_mutex_lock(mutex) sys_sem_wait(mutex)
135#define sys_mutex_unlock(mutex) sys_sem_signal(mutex)
136#define sys_mutex_free(mutex) sys_sem_free(mutex)
137#define sys_mutex_valid(mutex) sys_sem_valid(mutex)
138#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex)
139
140#else /* LWIP_COMPAT_MUTEX */
141
150err_t sys_mutex_new(sys_mutex_t *mutex);
156void sys_mutex_lock(sys_mutex_t *mutex);
162void sys_mutex_unlock(sys_mutex_t *mutex);
168void sys_mutex_free(sys_mutex_t *mutex);
169#ifndef sys_mutex_valid
174int sys_mutex_valid(sys_mutex_t *mutex);
175#endif
176#ifndef sys_mutex_set_invalid
181void sys_mutex_set_invalid(sys_mutex_t *mutex);
182#endif
183#endif /* LWIP_COMPAT_MUTEX */
184
185/* Semaphore functions: */
186
194err_t sys_sem_new(sys_sem_t *sem, u8_t count);
200void sys_sem_signal(sys_sem_t *sem);
209u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);
215void sys_sem_free(sys_sem_t *sem);
217#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0)
218#ifndef sys_sem_valid
223int sys_sem_valid(sys_sem_t *sem);
224#endif
225#ifndef sys_sem_set_invalid
230void sys_sem_set_invalid(sys_sem_t *sem);
231#endif
232#ifndef sys_sem_valid_val
236#define sys_sem_valid_val(sem) sys_sem_valid(&(sem))
237#endif
238#ifndef sys_sem_set_invalid_val
242#define sys_sem_set_invalid_val(sem) sys_sem_set_invalid(&(sem))
243#endif
244
245#ifndef sys_msleep
250void sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */
251#endif
252
253/* Mailbox functions. */
254
262err_t sys_mbox_new(sys_mbox_t *mbox, int size);
270void sys_mbox_post(sys_mbox_t *mbox, void *msg);
279err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg);
290u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout);
291/* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */
292#ifndef sys_arch_mbox_tryfetch
301u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg);
302#endif
306#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
312void sys_mbox_free(sys_mbox_t *mbox);
313#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)
314#ifndef sys_mbox_valid
319int sys_mbox_valid(sys_mbox_t *mbox);
320#endif
321#ifndef sys_mbox_set_invalid
327#endif
328#ifndef sys_mbox_valid_val
332#define sys_mbox_valid_val(mbox) sys_mbox_valid(&(mbox))
333#endif
334#ifndef sys_mbox_set_invalid_val
338#define sys_mbox_set_invalid_val(mbox) sys_mbox_set_invalid(&(mbox))
339#endif
340
341
352sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);
354int sys_thread_join(sys_thread_t thread);
356int sys_thread_is_current(sys_thread_t thread);
357
358#endif /* NO_SYS */
359
360/* sys_init() must be called before anything else. */
361void sys_init(void);
362
363#ifndef sys_jiffies
367u32_t sys_jiffies(void);
368#endif
369
375u32_t sys_now(void);
376
377/* Critical Region Protection */
378/* These functions must be implemented in the sys_arch.c file.
379 In some implementations they can provide a more light-weight protection
380 mechanism than using semaphores. Otherwise semaphores can be used for
381 implementation */
382#ifndef SYS_ARCH_PROTECT
388#if SYS_LIGHTWEIGHT_PROT
389
397#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
409#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
420#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
421sys_prot_t sys_arch_protect(void);
422void sys_arch_unprotect(sys_prot_t pval);
423
424#else
425
426#define SYS_ARCH_DECL_PROTECT(lev)
427#define SYS_ARCH_PROTECT(lev)
428#define SYS_ARCH_UNPROTECT(lev)
429
430#endif /* SYS_LIGHTWEIGHT_PROT */
431
432#endif /* SYS_ARCH_PROTECT */
433
434/*
435 * Macros to set/get and increase/decrease variables in a thread-safe way.
436 * Use these for accessing variable that are used from more than one thread.
437 */
438
439#ifndef SYS_ARCH_INC
440#define SYS_ARCH_INC(var, val) do { \
441 SYS_ARCH_DECL_PROTECT(old_level); \
442 SYS_ARCH_PROTECT(old_level); \
443 var += val; \
444 SYS_ARCH_UNPROTECT(old_level); \
445 } while(0)
446#endif /* SYS_ARCH_INC */
447
448#ifndef SYS_ARCH_DEC
449#define SYS_ARCH_DEC(var, val) do { \
450 SYS_ARCH_DECL_PROTECT(old_level); \
451 SYS_ARCH_PROTECT(old_level); \
452 var -= val; \
453 SYS_ARCH_UNPROTECT(old_level); \
454 } while(0)
455#endif /* SYS_ARCH_DEC */
456
457#ifndef SYS_ARCH_GET
458#define SYS_ARCH_GET(var, ret) do { \
459 SYS_ARCH_DECL_PROTECT(old_level); \
460 SYS_ARCH_PROTECT(old_level); \
461 ret = var; \
462 SYS_ARCH_UNPROTECT(old_level); \
463 } while(0)
464#endif /* SYS_ARCH_GET */
465
466#ifndef SYS_ARCH_SET
467#define SYS_ARCH_SET(var, val) do { \
468 SYS_ARCH_DECL_PROTECT(old_level); \
469 SYS_ARCH_PROTECT(old_level); \
470 var = val; \
471 SYS_ARCH_UNPROTECT(old_level); \
472 } while(0)
473#endif /* SYS_ARCH_SET */
474
475
476#ifdef __cplusplus
477}
478#endif
479
480#endif /* LWIP_HDR_SYS_H */
s8_t err_t
Definition err.h:76
void sys_mbox_set_invalid(sys_mbox_t *mbox)
Definition sys_arch.cc:334
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
Definition sys_arch.cc:290
int sys_mbox_valid(sys_mbox_t *mbox)
Definition sys_arch.cc:330
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
Definition sys_arch.cc:266
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
Definition sys_arch.cc:313
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
Definition sys_arch.cc:250
void sys_mbox_free(sys_mbox_t *mbox)
Definition sys_arch.cc:255
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
Definition sys_arch.cc:279
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
Definition sys_arch.cc:104
void sys_msleep(u32_t ms)
Definition sys.c:112
void sys_mutex_free(sys_mutex_t *mutex)
Definition sys_arch.cc:355
err_t sys_mutex_new(sys_mutex_t *mutex)
Definition sys_arch.cc:338
void sys_mutex_set_invalid(sys_mutex_t *mutex)
Definition sys_arch.cc:365
void sys_mutex_lock(sys_mutex_t *mutex)
Definition sys_arch.cc:344
void sys_mutex_unlock(sys_mutex_t *mutex)
Definition sys_arch.cc:350
int sys_mutex_valid(sys_mutex_t *mutex)
Definition sys_arch.cc:361
int sys_sem_valid(sys_sem_t *sem)
Definition sys_arch.cc:162
void sys_sem_set_invalid(sys_sem_t *sem)
Definition sys_arch.cc:174
void sys_sem_free(sys_sem_t *sem)
Definition sys_arch.cc:152
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
Definition sys_arch.cc:189
void sys_sem_signal(sys_sem_t *sem)
Definition sys_arch.cc:180
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
Definition sys_arch.cc:138
u32_t sys_now(void)
Definition sys_arch.cc:78
int sys_thread_is_current(sys_thread_t thread)
Definition sys_arch.cc:126
int sys_thread_join(sys_thread_t thread)
Definition sys_arch.cc:114
u32_t sys_jiffies(void)
void(* lwip_thread_fn)(void *arg)
Definition sys.h:117
err_t sys_mbox_post_and_close(sys_mbox_t *mbox, void *msg)
Definition sys_arch.cc:272