Subversion Repositories Kolibri OS

Rev

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
 
-
 
363
        xor     esi, esi
-
 
364
        mov     edi, ecx
-
 
365
 
-
 
366
.wake_list:
-
 
367
 
-
 
368
        mov     ebx, [eax+MUTEX_WAITER.list.next]
-
 
369
        list_del eax
-
 
370
        mov     edx, [eax+MUTEX_WAITER.task]
-
 
371
        mov     [edx+TASKDATA.state], 0
-
 
372
        inc     esi
-
 
373
        cmp     edi, ebx
-
 
374
        je      .wake_done
-
 
375
 
-
 
376
        mov     ecx, [ebx+MUTEX_WAITER.type]
-
 
377
        test    ecx, ecx
-
 
378
        jz      .wake_done
-
 
379
 
-
 
380
        mov     eax, ebx
-
 
381
        jmp     .wake_list
-
 
382
 
-
 
383
.wake_done:
-
 
384
        add     [edi+RWSEM.count], esi
-
 
385
 
-
 
386
        pop     edi
-
 
387
        pop     esi
-
 
388
        pop     ebx
-
 
389
        popfd
-
 
390
        ret
-
 
391
 
-
 
392
 
-
 
393
purge MUTEX_WAITER
-
 
Line 394... Line 154...
394
purge RWSEM_WAITING_FOR_WRITE
154
 
395
purge RWSEM_WAITING_FOR_READ
155
 
396
 
156