Rev 5565 | Rev 5599 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5565 | Rev 5593 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 5565 $ |
8 | $Revision: 5593 $ |
9 | 9 | ||
10 | 10 | ||
Line 151... | Line 151... | ||
151 | @@: |
151 | @@: |
152 | ret |
152 | ret |
153 | ;end. |
153 | ;end. |
Line 154... | Line -... | ||
154 | - | ||
155 | - | ||
156 | struct MUTEX_WAITER |
- | |
157 | list LHEAD |
- | |
158 | task dd ? |
- | |
159 | type dd ? |
- | |
160 | ends |
- | |
161 | - | ||
162 | RWSEM_WAITING_FOR_WRITE equ 0 |
- | |
163 | RWSEM_WAITING_FOR_READ equ 1 |
- | |
164 | - | ||
165 | ;void __fastcall mutex_init(struct mutex *lock) |
- | |
166 | - | ||
167 | align 4 |
- | |
168 | mutex_init: |
- | |
169 | mov [ecx+MUTEX.wait_list.next], ecx |
- | |
170 | mov [ecx+MUTEX.wait_list.prev], ecx |
- | |
171 | mov [ecx+MUTEX.count], 1 |
- | |
172 | ret |
- | |
173 | - | ||
174 | ;void __fastcall mutex_lock(struct mutex *lock) |
- | |
175 | - | ||
176 | align 4 |
- | |
177 | mutex_lock: |
- | |
178 | - | ||
179 | dec [ecx+MUTEX.count] |
- | |
180 | jns .done |
- | |
181 | - | ||
182 | pushfd |
- | |
183 | cli |
- | |
184 | - | ||
185 | sub esp, sizeof.MUTEX_WAITER |
- | |
186 | - | ||
187 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
188 | - | ||
189 | mov edx, [TASK_BASE] |
- | |
190 | mov [esp+MUTEX_WAITER.task], edx |
- | |
191 | - | ||
192 | .forever: |
- | |
193 | - | ||
194 | mov eax, -1 |
- | |
195 | xchg eax, [ecx+MUTEX.count] |
- | |
196 | dec eax |
- | |
197 | jz @F |
- | |
198 | - | ||
199 | mov [edx+TASKDATA.state], 1 |
- | |
200 | call change_task |
- | |
201 | jmp .forever |
- | |
202 | @@: |
- | |
203 | mov eax, ecx |
- | |
204 | list_del esp |
- | |
205 | - | ||
206 | cmp [eax+MUTEX.wait_list.next], eax |
- | |
207 | jne @F |
- | |
208 | - | ||
209 | mov [eax+MUTEX.count], 0 |
- | |
210 | @@: |
- | |
211 | add esp, sizeof.MUTEX_WAITER |
- | |
212 | - | ||
213 | popfd |
- | |
214 | .done: |
- | |
215 | ret |
- | |
216 | - | ||
217 | ;void __fastcall mutex_unlock(struct mutex *lock) |
- | |
218 | - | ||
219 | align 4 |
- | |
220 | mutex_unlock: |
- | |
221 | - | ||
222 | pushfd |
- | |
223 | cli |
- | |
224 | - | ||
225 | mov eax, [ecx+MUTEX.wait_list.next] |
- | |
226 | cmp eax, ecx |
- | |
227 | mov [ecx+MUTEX.count], 1 |
- | |
228 | je @F |
- | |
229 | - | ||
230 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
231 | mov [eax+TASKDATA.state], 0 |
- | |
232 | @@: |
- | |
233 | popfd |
- | |
234 | ret |
- | |
235 | - | ||
236 | - | ||
237 | ;void __fastcall init_rwsem(struct rw_semaphore *sem) |
- | |
238 | - | ||
239 | align 4 |
- | |
240 | init_rwsem: |
- | |
241 | mov [ecx+RWSEM.wait_list.next], ecx |
- | |
242 | mov [ecx+RWSEM.wait_list.prev], ecx |
- | |
243 | mov [ecx+RWSEM.count], 0 |
- | |
244 | ret |
- | |
245 | - | ||
246 | ;void __fastcall down_read(struct rw_semaphore *sem) |
- | |
247 | - | ||
248 | align 4 |
- | |
249 | down_read: |
- | |
250 | pushfd |
- | |
251 | cli |
- | |
252 | - | ||
253 | mov eax, [ecx+RWSEM.count] |
- | |
254 | test eax, eax |
- | |
255 | js @F |
- | |
256 | - | ||
257 | cmp ecx, [ecx+RWSEM.wait_list.next] |
- | |
258 | je .ok |
- | |
259 | @@: |
- | |
260 | sub esp, sizeof.MUTEX_WAITER |
- | |
261 | - | ||
262 | mov eax, [TASK_BASE] |
- | |
263 | mov [esp+MUTEX_WAITER.task], eax |
- | |
264 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ |
- | |
265 | mov [eax+TASKDATA.state], 1 |
- | |
266 | - | ||
267 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
268 | - | ||
269 | call change_task |
- | |
270 | - | ||
271 | add esp, sizeof.MUTEX_WAITER |
- | |
272 | popfd |
- | |
273 | ret |
- | |
274 | .ok: |
- | |
275 | inc eax |
- | |
276 | mov [ecx+RWSEM.count], eax |
- | |
277 | - | ||
278 | popfd |
- | |
279 | ret |
- | |
280 | - | ||
281 | ;void __fastcall down_write(struct rw_semaphore *sem) |
- | |
282 | - | ||
283 | align 4 |
- | |
284 | down_write: |
- | |
285 | pushfd |
- | |
286 | cli |
- | |
287 | sub esp, sizeof.MUTEX_WAITER |
- | |
288 | - | ||
289 | mov edx, [TASK_BASE] |
- | |
290 | mov [esp+MUTEX_WAITER.task], edx |
- | |
291 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE |
- | |
292 | mov [edx+TASKDATA.state], 1 |
- | |
293 | - | ||
294 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
295 | - | ||
296 | xor eax, eax |
- | |
297 | not eax |
- | |
298 | - | ||
299 | .forever: |
- | |
300 | test eax, [ecx+RWSEM.count] |
- | |
301 | jz @F |
- | |
302 | - | ||
303 | mov [edx+TASKDATA.state], 1 |
- | |
304 | call change_task |
- | |
305 | jmp .forever |
- | |
306 | @@: |
- | |
307 | mov [ecx+RWSEM.count], eax |
- | |
308 | list_del esp |
- | |
309 | - | ||
310 | add esp, sizeof.MUTEX_WAITER |
- | |
311 | popfd |
- | |
312 | ret |
- | |
313 | - | ||
314 | ;void __fastcall up_read(struct rw_semaphore *sem) |
- | |
315 | - | ||
316 | align 4 |
- | |
317 | up_read: |
- | |
318 | pushfd |
- | |
319 | cli |
- | |
320 | - | ||
321 | dec [ecx+RWSEM.count] |
- | |
322 | jnz @F |
- | |
323 | - | ||
324 | mov eax, [ecx+RWSEM.wait_list.next] |
- | |
325 | cmp eax, ecx |
- | |
326 | je @F |
- | |
327 | - | ||
328 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
329 | mov [eax+TASKDATA.state], 0 |
- | |
330 | @@: |
- | |
331 | popfd |
- | |
332 | ret |
- | |
333 | - | ||
334 | ;void __fastcall up_write(struct rw_semaphore *sem) |
- | |
335 | - | ||
336 | align 4 |
- | |
337 | up_write: |
- | |
338 | - | ||
339 | pushfd |
- | |
340 | cli |
- | |
341 | - | ||
342 | mov eax, [ecx+RWSEM.wait_list.next] |
- | |
343 | mov [ecx+RWSEM.count], 0 |
- | |
344 | - | ||
345 | cmp ecx, eax |
- | |
346 | je .done |
- | |
347 | - | ||
348 | mov edx, [eax+MUTEX_WAITER.type] |
- | |
349 | test edx, edx |
- | |
350 | jnz .wake |
- | |
351 | - | ||
352 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
353 | mov [eax+TASKDATA.state], 0 |
- | |
354 | .done: |
- | |
355 | popfd |
- | |
356 | ret |
- | |
357 | - | ||
358 | .wake: |
- | |
359 | push ebx |
- | |
360 | push esi |
- | |
361 | push edi |
- | |
362 | - |