Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 #include <hwcore/irq.h> 020 #include <hwcore/irq.h>
021 #include <sos/assert.h> <<
022 021
023 022
024 #include "ksynch.h" 023 #include "ksynch.h"
025 024
026 025
027 sos_ret_t sos_ksema_init(struct sos_ksema *sem 026 sos_ret_t sos_ksema_init(struct sos_ksema *sema, const char *name,
028 int initial_value, !! 027 int initial_value)
029 sos_kwaitq_ordering_t <<
030 { 028 {
031 sema->value = initial_value; 029 sema->value = initial_value;
032 return sos_kwaitq_init(& sema->kwaitq, name, !! 030 return sos_kwaitq_init(& sema->kwaitq, name);
033 } 031 }
034 032
035 033
036 sos_ret_t sos_ksema_dispose(struct sos_ksema * 034 sos_ret_t sos_ksema_dispose(struct sos_ksema *sema)
037 { 035 {
038 return sos_kwaitq_dispose(& sema->kwaitq); 036 return sos_kwaitq_dispose(& sema->kwaitq);
039 } 037 }
040 038
041 039
042 sos_ret_t sos_ksema_down(struct sos_ksema *sem 040 sos_ret_t sos_ksema_down(struct sos_ksema *sema,
043 struct sos_time *time 041 struct sos_time *timeout)
044 { 042 {
045 sos_ui32_t flags; 043 sos_ui32_t flags;
046 sos_ret_t retval; 044 sos_ret_t retval;
047 045
048 sos_disable_IRQs(flags); 046 sos_disable_IRQs(flags);
049 retval = SOS_OK; 047 retval = SOS_OK;
050 048
051 sema->value --; 049 sema->value --;
052 if (sema->value < 0) 050 if (sema->value < 0)
053 { 051 {
054 052
055 retval = sos_kwaitq_wait(& sema->kwaitq, 053 retval = sos_kwaitq_wait(& sema->kwaitq, timeout);
056 054
057 055
058 if (SOS_OK != retval) 056 if (SOS_OK != retval)
059 { 057 {
060 058
061 sema->value ++; 059 sema->value ++;
062 } 060 }
063 } 061 }
064 062
065 sos_restore_IRQs(flags); 063 sos_restore_IRQs(flags);
066 return retval; 064 return retval;
067 } 065 }
068 066
069 067
070 sos_ret_t sos_ksema_trydown(struct sos_ksema * 068 sos_ret_t sos_ksema_trydown(struct sos_ksema *sema)
071 { 069 {
072 sos_ui32_t flags; 070 sos_ui32_t flags;
073 sos_ret_t retval; 071 sos_ret_t retval;
074 072
075 sos_disable_IRQs(flags); 073 sos_disable_IRQs(flags);
076 074
077 075
078 if (sema->value >= 1) 076 if (sema->value >= 1)
079 { 077 {
080 078
081 sema->value --; 079 sema->value --;
082 retval = SOS_OK; 080 retval = SOS_OK;
083 } 081 }
084 else 082 else
085 { 083 {
086 084
087 retval = -SOS_EBUSY; 085 retval = -SOS_EBUSY;
088 } 086 }
089 087
090 sos_restore_IRQs(flags); 088 sos_restore_IRQs(flags);
091 return retval; 089 return retval;
092 } 090 }
093 091
094 092
095 sos_ret_t sos_ksema_up(struct sos_ksema *sema) 093 sos_ret_t sos_ksema_up(struct sos_ksema *sema)
096 { 094 {
097 sos_ui32_t flags; 095 sos_ui32_t flags;
098 sos_ret_t retval; 096 sos_ret_t retval;
099 097
100 sos_disable_IRQs(flags); 098 sos_disable_IRQs(flags);
101 099
102 sema->value ++; 100 sema->value ++;
103 retval = sos_kwaitq_wakeup(& sema->kwaitq, 1 101 retval = sos_kwaitq_wakeup(& sema->kwaitq, 1, SOS_OK);
104 102
105 sos_restore_IRQs(flags); 103 sos_restore_IRQs(flags);
106 return retval; 104 return retval;
107 } 105 }
108 106
109 107
110 sos_ret_t sos_kmutex_init(struct sos_kmutex *m !! 108 sos_ret_t sos_kmutex_init(struct sos_kmutex *mutex, const char *name)
111 sos_kwaitq_ordering_ <<
112 { 109 {
113 mutex->owner = NULL; 110 mutex->owner = NULL;
114 return sos_kwaitq_init(& mutex->kwaitq, name !! 111 return sos_kwaitq_init(& mutex->kwaitq, name);
115 } 112 }
116 113
117 114
118 sos_ret_t sos_kmutex_dispose(struct sos_kmutex 115 sos_ret_t sos_kmutex_dispose(struct sos_kmutex *mutex)
119 { 116 {
120 return sos_kwaitq_dispose(& mutex->kwaitq); 117 return sos_kwaitq_dispose(& mutex->kwaitq);
121 } 118 }
122 119
123 120
124 121
125 122
126 123
127 124
128 125
129 126
130 127
131 128
132 129
133 sos_ret_t sos_kmutex_lock(struct sos_kmutex *m 130 sos_ret_t sos_kmutex_lock(struct sos_kmutex *mutex,
134 struct sos_time *tim 131 struct sos_time *timeout)
135 { 132 {
136 __label__ exit_kmutex_lock; 133 __label__ exit_kmutex_lock;
137 sos_ui32_t flags; 134 sos_ui32_t flags;
138 sos_ret_t retval; 135 sos_ret_t retval;
139 136
140 sos_disable_IRQs(flags); 137 sos_disable_IRQs(flags);
141 retval = SOS_OK; 138 retval = SOS_OK;
142 139
143 140
144 if (NULL != mutex->owner) 141 if (NULL != mutex->owner)
145 { 142 {
146 143
147 if (sos_thread_get_current() == mutex->o 144 if (sos_thread_get_current() == mutex->owner)
148 { 145 {
149 146
150 retval = -SOS_EBUSY; 147 retval = -SOS_EBUSY;
151 goto exit_kmutex_lock; 148 goto exit_kmutex_lock;
152 } 149 }
153 150
154 151
155 retval = sos_kwaitq_wait(& mutex->kwaitq 152 retval = sos_kwaitq_wait(& mutex->kwaitq, timeout);
156 153
157 154
158 if (SOS_OK != retval) 155 if (SOS_OK != retval)
159 { 156 {
160 goto exit_kmutex_lock; 157 goto exit_kmutex_lock;
161 } 158 }
162 } 159 }
163 160
164 161
165 mutex->owner = sos_thread_get_current(); 162 mutex->owner = sos_thread_get_current();
166 163
167 exit_kmutex_lock: 164 exit_kmutex_lock:
168 sos_restore_IRQs(flags); 165 sos_restore_IRQs(flags);
169 return retval; 166 return retval;
170 } 167 }
171 168
172 169
173 sos_bool_t sos_kmutex_owned_by_me(struct sos_k <<
174 { <<
175 sos_ui32_t flags; <<
176 sos_bool_t retval; <<
177 <<
178 sos_disable_IRQs(flags); <<
179 retval = (sos_thread_get_current() == mutex- <<
180 sos_restore_IRQs(flags); <<
181 <<
182 return retval; <<
183 } <<
184 <<
185 <<
186 sos_ret_t sos_kmutex_trylock(struct sos_kmutex 170 sos_ret_t sos_kmutex_trylock(struct sos_kmutex *mutex)
187 { 171 {
188 sos_ui32_t flags; 172 sos_ui32_t flags;
189 sos_ret_t retval; 173 sos_ret_t retval;
190 174
191 sos_disable_IRQs(flags); 175 sos_disable_IRQs(flags);
192 176
193 177
194 if (NULL == mutex->owner) 178 if (NULL == mutex->owner)
195 { 179 {
196 180
197 mutex->owner = sos_thread_get_current(); 181 mutex->owner = sos_thread_get_current();
198 182
199 retval = SOS_OK; 183 retval = SOS_OK;
200 } 184 }
201 else 185 else
202 { 186 {
203 187
204 retval = -SOS_EBUSY; 188 retval = -SOS_EBUSY;
205 } 189 }
206 190
207 sos_restore_IRQs(flags); 191 sos_restore_IRQs(flags);
208 return retval; 192 return retval;
209 } 193 }
210 194
211 195
212 sos_ret_t sos_kmutex_unlock(struct sos_kmutex 196 sos_ret_t sos_kmutex_unlock(struct sos_kmutex *mutex)
213 { 197 {
214 sos_ui32_t flags; 198 sos_ui32_t flags;
215 sos_ret_t retval; 199 sos_ret_t retval;
216 200
217 sos_disable_IRQs(flags); 201 sos_disable_IRQs(flags);
218 202
219 if (sos_thread_get_current() != mutex->owner 203 if (sos_thread_get_current() != mutex->owner)
220 retval = -SOS_EPERM; 204 retval = -SOS_EPERM;
221 205
222 else if (sos_kwaitq_is_empty(& mutex->kwaitq 206 else if (sos_kwaitq_is_empty(& mutex->kwaitq))
223 { 207 {
224 208
225 209
226 210
227 211
228 mutex->owner = NULL; 212 mutex->owner = NULL;
229 retval = SOS_OK; 213 retval = SOS_OK;
230 } 214 }
231 else 215 else
232 { 216 {
233 217
234 218
235 219
236 220
237 221
238 222
239 223
240 !! 224
241 <<
242 <<
243 <<
244 225
245 226
246 227
247 #define MUTEX_STILL_LOCKED ((struct sos_thread <<
248 mutex->owner = MUTEX_STILL_LOCKED; <<
249 <<
250 <<
251 retval = sos_kwaitq_wakeup(& mutex->kwai 228 retval = sos_kwaitq_wakeup(& mutex->kwaitq, 1, SOS_OK);
252 } 229 }
253 230
254 sos_restore_IRQs(flags); 231 sos_restore_IRQs(flags);
255 return retval; 232 return retval;
256 } 233 }