Subversion Repositories Kolibri OS

Rev

Rev 5343 | Rev 5363 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5343 Rev 5344
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. 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: 5343 $
8
$Revision: 5344 $
9
 
9
 
10
 
10
 
Line 153... Line 153...
153
  @@:
153
  @@:
154
        ret
154
        ret
155
;end.
155
;end.
Line 156... Line -...
156
 
-
 
157
 
156
 
158
 
157
 
159
struct  MUTEX_WAITER
158
struct  MUTEX_WAITER
160
        list    LHEAD
159
        list    LHEAD
161
        task    dd ?
160
        task    dd ?
Line -... Line 161...
-
 
161
        type    dd ?
-
 
162
ends
-
 
163
 
162
        type    dd ?
164
RWSEM_WAITING_FOR_WRITE equ 0
Line 163... Line 165...
163
ends
165
RWSEM_WAITING_FOR_READ  equ 1
164
 
166
 
165
;void  __fastcall mutex_init(struct mutex *lock)
167
;void  __fastcall mutex_init(struct mutex *lock)
Line 232... Line 234...
232
@@:
234
@@:
233
        popfd
235
        popfd
234
        ret
236
        ret
Line -... Line 237...
-
 
237
 
-
 
238
 
-
 
239
;void __fastcall init_rwsem(struct rw_semaphore *sem)
-
 
240
 
-
 
241
align 4
-
 
242
init_rwsem:
-
 
243
        mov     [ecx+RWSEM.wait_list.next], ecx
-
 
244
        mov     [ecx+RWSEM.wait_list.prev], ecx
-
 
245
        mov     [ecx+RWSEM.count], 0
235
 
246
        ret
Line 236... Line 247...
236
 
247
 
237
;void __fastcall down_read(struct rw_semaphore *sem)
248
;void __fastcall down_read(struct rw_semaphore *sem)
238
 
249
 
Line 250... Line 261...
250
@@:
261
@@:
251
        sub     esp, sizeof.MUTEX_WAITER
262
        sub     esp, sizeof.MUTEX_WAITER
Line 252... Line 263...
252
 
263
 
253
        mov     eax, [TASK_BASE]
264
        mov     eax, [TASK_BASE]
254
        mov     [esp+MUTEX_WAITER.task], eax
265
        mov     [esp+MUTEX_WAITER.task], eax
255
        mov     [esp+MUTEX_WAITER.type], 1; RWSEM_WAITING_FOR_READ
266
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
Line 256... Line 267...
256
        mov     [eax+TASKDATA.state], 1
267
        mov     [eax+TASKDATA.state], 1
Line 257... Line 268...
257
 
268
 
Line 277... Line 288...
277
        cli
288
        cli
278
        sub     esp, sizeof.MUTEX_WAITER
289
        sub     esp, sizeof.MUTEX_WAITER
Line 279... Line 290...
279
 
290
 
280
        mov     edx, [TASK_BASE]
291
        mov     edx, [TASK_BASE]
281
        mov     [esp+MUTEX_WAITER.task], edx
292
        mov     [esp+MUTEX_WAITER.task], edx
282
        mov     [esp+MUTEX_WAITER.type], 2; RWSEM_WAITING_FOR_WRITE
293
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
Line 283... Line 294...
283
        mov     [edx+TASKDATA.state], 1
294
        mov     [edx+TASKDATA.state], 1
Line 284... Line 295...
284
 
295
 
Line 300... Line 311...
300
 
311
 
301
        add     esp, sizeof.MUTEX_WAITER
312
        add     esp, sizeof.MUTEX_WAITER
302
        popfd
313
        popfd
Line -... Line 314...
-
 
314
        ret
-
 
315
 
-
 
316
;void __fastcall up_read(struct rw_semaphore *sem)
-
 
317
 
-
 
318
align 4
-
 
319
up_read:
-
 
320
        pushfd
-
 
321
        cli
-
 
322
 
-
 
323
        dec     [ecx+RWSEM.count]
-
 
324
        jnz     @F
-
 
325
 
-
 
326
        mov     eax, [ecx+RWSEM.wait_list.next]
-
 
327
        cmp     eax, ecx
-
 
328
        je      @F
-
 
329
 
-
 
330
        mov     eax, [eax+MUTEX_WAITER.task]
-
 
331
        mov     [eax+TASKDATA.state], 0
-
 
332
@@:
-
 
333
        popfd
-
 
334
        ret
-
 
335
 
-
 
336
;void __fastcall up_write(struct rw_semaphore *sem)
-
 
337
 
-
 
338
align 4
-
 
339
up_write:
-
 
340
 
-
 
341
        pushfd
-
 
342
        cli
-
 
343
 
-
 
344
        mov     eax, [ecx+RWSEM.wait_list.next]
-
 
345
        mov     [ecx+RWSEM.count], 0
-
 
346
 
-
 
347
        cmp     ecx, eax
-
 
348
        je      .done
-
 
349
 
-
 
350
        mov     edx, [eax+MUTEX_WAITER.type]
-
 
351
        test    edx, edx
-
 
352
        jnz     .wake
-
 
353
 
-
 
354
        mov     eax, [eax+MUTEX_WAITER.task]
-
 
355
        mov     [eax+TASKDATA.state], 0
-
 
356
.done:
-
 
357
        popfd
-
 
358
        ret
-
 
359
 
-
 
360
.wake:
-
 
361
        push    ebx
-
 
362
        push    esi
-
 
363
        push    edi
-
 
364
 
-
 
365
        xor     esi, esi
-
 
366
        mov     edi, ecx
-
 
367
 
-
 
368
.wake_list:
-
 
369
 
-
 
370
        mov     ebx, [eax+MUTEX_WAITER.list.next]
-
 
371
        list_del eax
-
 
372
        mov     edx, [eax+MUTEX_WAITER.task]
-
 
373
        mov     [edx+TASKDATA.state], 0
-
 
374
        inc     esi
-
 
375
        cmp     edi, ebx
-
 
376
        je      .wake_done
-
 
377
 
-
 
378
        mov     ecx, [ebx+MUTEX_WAITER.type]
-
 
379
        test    ecx, ecx
-
 
380
        jz      .wake_done
-
 
381
 
-
 
382
        mov     eax, ebx
-
 
383
        jmp     .wake_list
-
 
384
 
-
 
385
.wake_done:
-
 
386
        add     [edi+RWSEM.count], esi
-
 
387
 
-
 
388
        pop     edi
-
 
389
        pop     esi
-
 
390
        pop     ebx
-
 
391
        popfd
-
 
392
        ret
303
        ret
393
 
-
 
394
 
-
 
395
purge MUTEX_WAITER
-
 
396
purge RWSEM_WAITING_FOR_WRITE
Line 304... Line 397...
304
 
397
purge RWSEM_WAITING_FOR_READ
305
purge MUTEX_WAITER
398
 
306
 
399
 
307
MAX_PRIORITY      = 0   ; highest, used for kernel tasks
400
MAX_PRIORITY      = 0   ; highest, used for kernel tasks