Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4973 right-hear 1
#ifndef __MENUETOS_SEM_H
2
#define __MENUETOS_SEM_H
3
 
4
#ifdef __cplusplus
5
extern "C" {
6
#endif
7
 
8
typedef volatile struct {
9
 unsigned long s_magic;
10
 volatile unsigned long s_value;
11
 volatile unsigned long s_lock;
12
} semaphore_t;
13
 
14
#define SEM_MAGIC	0x1BAD2E20
15
 
16
#define SEM_INIT	{ SEM_MAGIC , 0 , 0 }
17
 
18
static inline semaphore_t * get_sem_init(void)
19
{
20
 static semaphore_t __ret=SEM_INIT;
21
 return &__ret;
22
}
23
 
24
static inline void fill_empty_sem(semaphore_t * sem)
25
{
26
 if(sem)
27
 {
28
  memcpy((void *)sem,(const void *)get_sem_init(),sizeof(semaphore_t));
29
 }
30
}
31
 
32
#define DECLARE_SEMAPHORE(name)	  semaphore_t name = SEM_INIT ;
33
#define DECLARE_STATIC_SEM(name)  static semaphore_t name = SEM_INIT ;
34
#define DECLARE_SEMAPHORE_S(name) semaphore_t name
35
 
36
#define check_sem_magic(s)	((s)->s_magic==SEM_MAGIC)
37
 
38
#define SEM_VAL(s)	(s)->s_value
39
#define SEM_LOCK(s)	(s)->s_lock
40
 
41
#define sem_lock_acquire(sem) \
42
    { \
43
LOCKED: \
44
	if(check_sem_magic(sem)) \
45
	{ \
46
	    if(SEM_LOCK(sem)) \
47
	    { \
48
		__menuet__delay100(1); \
49
		goto LOCKED; \
50
	    } \
51
	} \
52
    }
53
 
54
#define sem_lock(sem) \
55
    { \
56
	if(check_sem_magic(sem)) \
57
	{ \
58
	    sem_lock_acquire(sem); \
59
	    SEM_LOCK(sem)++; \
60
	} \
61
    }
62
 
63
#define sem_unlock(sem) \
64
    { \
65
	if(check_sem_magic(sem)) \
66
	{ \
67
	    if(SEM_LOCK(sem)) SEM_LOCK(sem)--; \
68
	} \
69
    }
70
 
71
#define sem_read(sem) \
72
    ({ \
73
	volatile unsigned long __ret; \
74
	if(check_sem_magic(sem)) \
75
	{ \
76
	    sem_lock(sem); \
77
	    __ret=SEM_VAL(sem); \
78
	    sem_unlock(sem); \
79
	} else { \
80
	    __ret=0; \
81
	} \
82
	__ret; \
83
    })
84
 
85
#define sem_write(sem,val) \
86
    { \
87
	if(check_sem_magic(sem)) \
88
	{ \
89
	    sem_lock(sem); \
90
	    SEM_VAL(sem)=(val); \
91
	    sem_unlock(sem); \
92
	} \
93
    }
94
 
95
#define sem_up(sem) \
96
    { \
97
	if(check_sem_magic(sem)) \
98
	{ \
99
	    sem_lock(sem); \
100
	    SEM_VAL(sem)++; \
101
	    sem_unlock(sem); \
102
	} \
103
    }
104
 
105
#define sem_down(sem) \
106
    { \
107
	if(check_sem_magic(sem)) \
108
	{ \
109
	    sem_lock(sem); \
110
	    if(SEM_VAL(sem)) SEM_VAL(sem)--; \
111
	    sem_unlock(sem); \
112
	} \
113
    }
114
 
115
#define sem_isup(sem) \
116
    { \
117
	int __ret; \
118
	if(check_sem_magic(sem)) \
119
	{ \
120
	    sem_lock(sem); \
121
	    __ret=SEM_VAL(sem) ? 1 : 0; \
122
	    sem_unlock(sem); \
123
	} \
124
	__ret; \
125
    }
126
 
127
#define sem_isdown(sem) \
128
    { \
129
	int __ret; \
130
	if(check_sem_magic(sem)) \
131
	{ \
132
	    sem_lock(sem); \
133
	    __ret=SEM_VAL(sem) ? 0 : 1; \
134
	    sem_unlock(sem); \
135
	} \
136
	__ret; \
137
    }
138
 
139
#ifdef __cplusplus
140
}
141
#endif
142
 
143
#endif