ReactOS 0.4.16-dev-736-g28b802b
sys.h
Go to the documentation of this file.
1
6/*
7 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without modification,
11 * are permitted provided that the following conditions are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30 * OF SUCH DAMAGE.
31 *
32 * This file is part of the lwIP TCP/IP stack.
33 *
34 * Author: Adam Dunkels <adam@sics.se>
35 */
36
37#ifndef LWIP_HDR_SYS_H
38#define LWIP_HDR_SYS_H
39
40#include "lwip/opt.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46#if NO_SYS
47
48/* For a totally minimal and standalone system, we provide null
49 definitions of the sys_ functions. */
50typedef u8_t sys_sem_t;
51typedef u8_t sys_mutex_t;
52typedef u8_t sys_mbox_t;
53
54#define sys_sem_new(s, c) ERR_OK
55#define sys_sem_signal(s)
56#define sys_sem_wait(s)
57#define sys_arch_sem_wait(s,t)
58#define sys_sem_free(s)
59#define sys_sem_valid(s) 0
60#define sys_sem_valid_val(s) 0
61#define sys_sem_set_invalid(s)
62#define sys_sem_set_invalid_val(s)
63#define sys_mutex_new(mu) ERR_OK
64#define sys_mutex_lock(mu)
65#define sys_mutex_unlock(mu)
66#define sys_mutex_free(mu)
67#define sys_mutex_valid(mu) 0
68#define sys_mutex_set_invalid(mu)
69#define sys_mbox_new(m, s) ERR_OK
70#define sys_mbox_fetch(m,d)
71#define sys_mbox_tryfetch(m,d)
72#define sys_mbox_post(m,d)
73#define sys_mbox_trypost(m,d)
74#define sys_mbox_free(m)
75#define sys_mbox_valid(m)
76#define sys_mbox_valid_val(m)
77#define sys_mbox_set_invalid(m)
78#define sys_mbox_set_invalid_val(m)
79
80#define sys_thread_new(n,t,a,s,p)
81
82#define sys_msleep(t)
83
84#else /* NO_SYS */
85
87#define SYS_ARCH_TIMEOUT 0xffffffffUL
88
92#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT
93
94#include "lwip/err.h"
95#include "arch/sys_arch.h"
96
98typedef void (*lwip_thread_fn)(void *arg);
99
100/* Function prototypes for functions to be implemented by platform ports
101 (in sys_arch.c) */
102
103/* Mutex functions: */
104
107#ifndef LWIP_COMPAT_MUTEX
108#define LWIP_COMPAT_MUTEX 0
109#endif
110
111#if LWIP_COMPAT_MUTEX
112/* for old ports that don't have mutexes: define them to binary semaphores */
113#define sys_mutex_t sys_sem_t
114#define sys_mutex_new(mutex) sys_sem_new(mutex, 1)
115#define sys_mutex_lock(mutex) sys_sem_wait(mutex)
116#define sys_mutex_unlock(mutex) sys_sem_signal(mutex)
117#define sys_mutex_free(mutex) sys_sem_free(mutex)
118#define sys_mutex_valid(mutex) sys_sem_valid(mutex)
119#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex)
120
121#else /* LWIP_COMPAT_MUTEX */
122
156#ifndef sys_mutex_valid
165#endif
166#ifndef sys_mutex_set_invalid
175#endif
176#endif /* LWIP_COMPAT_MUTEX */
177
178/* Semaphore functions: */
179
227#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0)
228#ifndef sys_sem_valid
237#endif
238#ifndef sys_sem_set_invalid
247#endif
248#ifndef sys_sem_valid_val
252#define sys_sem_valid_val(sem) sys_sem_valid(&(sem))
253#endif
254#ifndef sys_sem_set_invalid_val
258#define sys_sem_set_invalid_val(sem) sys_sem_set_invalid(&(sem))
259#endif
260
261#ifndef sys_msleep
266void sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */
267#endif
268
269/* Mailbox functions. */
270
294void sys_mbox_post(sys_mbox_t *mbox, void *msg);
337/* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */
338#ifndef sys_arch_mbox_tryfetch
356#endif
360#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
369void sys_mbox_free(sys_mbox_t *mbox);
370#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)
371#ifndef sys_mbox_valid
379int sys_mbox_valid(sys_mbox_t *mbox);
380#endif
381#ifndef sys_mbox_set_invalid
390#endif
391#ifndef sys_mbox_valid_val
395#define sys_mbox_valid_val(mbox) sys_mbox_valid(&(mbox))
396#endif
397#ifndef sys_mbox_set_invalid_val
401#define sys_mbox_set_invalid_val(mbox) sys_mbox_set_invalid(&(mbox))
402#endif
403
404
420sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);
421
422#endif /* NO_SYS */
423
430#if !defined LWIP_MARK_TCPIP_THREAD || defined __DOXYGEN__
431#define LWIP_MARK_TCPIP_THREAD()
432#endif
433
439void sys_init(void);
440
441#ifndef sys_jiffies
445u32_t sys_jiffies(void);
446#endif
447
448#ifdef LWIP_FUZZ_SYS_NOW
449/* This offset should be added to the time 'sys_now()' returns */
450extern u32_t sys_now_offset;
451#endif
452
461u32_t sys_now(void);
462
463/* Critical Region Protection */
464/* These functions must be implemented in the sys_arch.c file.
465 In some implementations they can provide a more light-weight protection
466 mechanism than using semaphores. Otherwise semaphores can be used for
467 implementation */
468#ifndef SYS_ARCH_PROTECT
474#if SYS_LIGHTWEIGHT_PROT
475
483#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
495#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
506#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
509
510#else
511
512#define SYS_ARCH_DECL_PROTECT(lev)
513#define SYS_ARCH_PROTECT(lev)
514#define SYS_ARCH_UNPROTECT(lev)
515
516#endif /* SYS_LIGHTWEIGHT_PROT */
517
518#endif /* SYS_ARCH_PROTECT */
519
520/*
521 * Macros to set/get and increase/decrease variables in a thread-safe way.
522 * Use these for accessing variable that are used from more than one thread.
523 */
524
525#ifndef SYS_ARCH_INC
526#define SYS_ARCH_INC(var, val) do { \
527 SYS_ARCH_DECL_PROTECT(old_level); \
528 SYS_ARCH_PROTECT(old_level); \
529 var += val; \
530 SYS_ARCH_UNPROTECT(old_level); \
531 } while(0)
532#endif /* SYS_ARCH_INC */
533
534#ifndef SYS_ARCH_DEC
535#define SYS_ARCH_DEC(var, val) do { \
536 SYS_ARCH_DECL_PROTECT(old_level); \
537 SYS_ARCH_PROTECT(old_level); \
538 var -= val; \
539 SYS_ARCH_UNPROTECT(old_level); \
540 } while(0)
541#endif /* SYS_ARCH_DEC */
542
543#ifndef SYS_ARCH_GET
544#define SYS_ARCH_GET(var, ret) do { \
545 SYS_ARCH_DECL_PROTECT(old_level); \
546 SYS_ARCH_PROTECT(old_level); \
547 ret = var; \
548 SYS_ARCH_UNPROTECT(old_level); \
549 } while(0)
550#endif /* SYS_ARCH_GET */
551
552#ifndef SYS_ARCH_SET
553#define SYS_ARCH_SET(var, val) do { \
554 SYS_ARCH_DECL_PROTECT(old_level); \
555 SYS_ARCH_PROTECT(old_level); \
556 var = val; \
557 SYS_ARCH_UNPROTECT(old_level); \
558 } while(0)
559#endif /* SYS_ARCH_SET */
560
561#ifndef SYS_ARCH_LOCKED
562#define SYS_ARCH_LOCKED(code) do { \
563 SYS_ARCH_DECL_PROTECT(old_level); \
564 SYS_ARCH_PROTECT(old_level); \
565 code; \
566 SYS_ARCH_UNPROTECT(old_level); \
567 } while(0)
568#endif /* SYS_ARCH_LOCKED */
569
570
571#ifdef __cplusplus
572}
573#endif
574
575#endif /* LWIP_HDR_SYS_H */
#define msg(x)
Definition: auth_time.c:54
static HANDLE thread
Definition: service.c:33
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
uint32_t u32_t
Definition: arch.h:129
uint8_t u8_t
Definition: arch.h:125
s8_t err_t
Definition: err.h:96
void sys_mbox_set_invalid(sys_mbox_t *mbox)
Definition: sys_arch.c:146
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
Definition: sys_arch.c:177
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
Definition: sys_arch.c:160
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
Definition: sys_arch.c:247
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
Definition: sys_arch.c:128
void sys_mbox_free(sys_mbox_t *mbox)
Definition: sys_arch.c:152
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
Definition: sys_arch.c:238
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
Definition: sys_arch.c:275
void sys_msleep(u32_t ms)
Definition: sys.c:135
void sys_init(void)
Definition: sys_arch.c:305
void sys_mutex_free(sys_mutex_t *mutex)
Definition: sys_arch.c:157
err_t sys_mutex_new(sys_mutex_t *mutex)
Definition: sys_arch.c:149
void sys_mutex_set_invalid(sys_mutex_t *mutex)
Definition: sys_arch.c:166
void sys_mutex_lock(sys_mutex_t *mutex)
Definition: sys_arch.c:173
void sys_mutex_unlock(sys_mutex_t *mutex)
Definition: sys_arch.c:185
void sys_sem_set_invalid(sys_sem_t *sem)
Definition: sys_arch.c:66
void sys_sem_free(sys_sem_t *sem)
Definition: sys_arch.c:72
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
Definition: sys_arch.c:86
void sys_sem_signal(sys_sem_t *sem)
Definition: sys_arch.c:80
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
Definition: sys_arch.c:46
u32_t sys_now(void)
Definition: sys_arch.c:23
#define sys_mbox_trypost_fromisr
Definition: sys_arch.h:31
struct _sys_mbox_t sys_mbox_t
void sys_arch_protect(sys_prot_t *lev)
Definition: sys_arch.c:33
struct _sys_sem_t sys_sem_t
void sys_arch_unprotect(sys_prot_t lev)
Definition: sys_arch.c:40
u32_t sys_thread_t
Definition: sys_arch.h:20
KIRQL sys_prot_t
Definition: sys_arch.h:18
#define sys_mbox_valid(mbox)
Definition: sys_arch.h:50
int sys_mutex_t
Definition: sys_arch.h:38
#define sys_mutex_valid(mutex)
Definition: sys_arch.h:39
#define sys_sem_valid(sema)
Definition: sys_arch.h:36
static HANDLE sem
Definition: sync.c:674
Definition: module.h:456
Definition: name.c:39
Definition: dhcpd.h:245
u32_t sys_jiffies(void)
Definition: sys_arch.c:48
void(* lwip_thread_fn)(void *arg)
Definition: sys.h:98
void * arg
Definition: msvc.h:10