Subversion Repositories Kolibri OS

Rev

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

Rev 5788 Rev 6079
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: 5788 $
8
$Revision: 6079 $
9
 
9
 
10
 
10
 
Line 156... Line 156...
156
  @@:
156
  @@:
157
        ret
157
        ret
158
;end.
158
;end.
Line 159... Line -...
159
 
-
 
160
 
-
 
161
struct  MUTEX_WAITER
-
 
162
        list    LHEAD
-
 
163
        task    dd ?
-
 
164
        type    dd ?
-
 
165
ends
-
 
166
 
-
 
167
RWSEM_WAITING_FOR_WRITE equ 0
-
 
168
RWSEM_WAITING_FOR_READ  equ 1
-
 
169
 
-
 
170
;void  __fastcall mutex_init(struct mutex *lock)
-
 
171
 
-
 
172
align 4
-
 
173
mutex_init:
-
 
174
        mov     [ecx+MUTEX.wait_list.next], ecx
-
 
175
        mov     [ecx+MUTEX.wait_list.prev], ecx
-
 
176
        mov     [ecx+MUTEX.count], 1
-
 
177
        ret
-
 
178
 
-
 
179
;void  __fastcall mutex_lock(struct mutex *lock)
-
 
180
 
-
 
181
align 4
-
 
182
mutex_lock:
-
 
183
 
-
 
184
        dec     [ecx+MUTEX.count]
-
 
185
        jns     .done
-
 
186
 
-
 
187
        pushfd
-
 
188
        cli
-
 
189
 
-
 
190
        sub     esp, sizeof.MUTEX_WAITER
-
 
191
 
-
 
192
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
-
 
193
 
-
 
194
        mov     edx, [TASK_BASE]
-
 
195
        mov     [esp+MUTEX_WAITER.task], edx
-
 
196
 
-
 
197
.forever:
-
 
198
 
-
 
199
        mov     eax, -1
-
 
200
        xchg    eax, [ecx+MUTEX.count]
-
 
201
        dec     eax
-
 
202
        jz      @F
-
 
203
 
-
 
204
        mov     [edx+TASKDATA.state], 1
-
 
205
        call    change_task
-
 
206
        jmp     .forever
-
 
207
@@:
-
 
208
        mov     eax, ecx
-
 
209
        list_del esp
-
 
210
 
-
 
211
        cmp     [eax+MUTEX.wait_list.next], eax
-
 
212
        jne     @F
-
 
213
 
-
 
214
        mov     [eax+MUTEX.count], 0
-
 
215
@@:
-
 
216
        add     esp, sizeof.MUTEX_WAITER
-
 
217
 
-
 
218
        popfd
-
 
219
.done:
-
 
220
        ret
-
 
221
 
-
 
222
;void  __fastcall mutex_unlock(struct mutex *lock)
-
 
223
 
-
 
224
align 4
-
 
225
mutex_unlock:
-
 
226
 
-
 
227
        pushfd
-
 
228
        cli
-
 
229
 
-
 
230
        mov     eax, [ecx+MUTEX.wait_list.next]
-
 
231
        cmp     eax, ecx
-
 
232
        mov     [ecx+MUTEX.count], 1
-
 
233
        je      @F
-
 
234
 
-
 
235
        mov     eax, [eax+MUTEX_WAITER.task]
-
 
236
        mov     [eax+TASKDATA.state], 0
-
 
237
@@:
-
 
238
        popfd
-
 
239
        ret
-
 
240
 
-
 
241
 
-
 
242
;void __fastcall init_rwsem(struct rw_semaphore *sem)
-
 
243
 
-
 
244
align 4
-
 
245
init_rwsem:
-
 
246
        mov     [ecx+RWSEM.wait_list.next], ecx
-
 
247
        mov     [ecx+RWSEM.wait_list.prev], ecx
-
 
248
        mov     [ecx+RWSEM.count], 0
-
 
249
        ret
-
 
250
 
-
 
251
;void __fastcall down_read(struct rw_semaphore *sem)
-
 
252
 
-
 
253
align 4
-
 
254
down_read:
-
 
255
        pushfd
-
 
256
        cli
-
 
257
 
-
 
258
        mov     eax, [ecx+RWSEM.count]
-
 
259
        test    eax, eax
-
 
260
        js      @F
-
 
261
 
-
 
262
        cmp     ecx, [ecx+RWSEM.wait_list.next]
-
 
263
        je      .ok
-
 
264
@@:
-
 
265
        sub     esp, sizeof.MUTEX_WAITER
-
 
266
 
-
 
267
        mov     eax, [TASK_BASE]
-
 
268
        mov     [esp+MUTEX_WAITER.task], eax
-
 
269
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
-
 
270
        mov     [eax+TASKDATA.state], 1
-
 
271
 
-
 
272
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
-
 
273
 
-
 
274
        call    change_task
-
 
275
 
-
 
276
        add     esp, sizeof.MUTEX_WAITER
-
 
277
        popfd
-
 
278
        ret
-
 
279
.ok:
-
 
280
        inc     eax
-
 
281
        mov     [ecx+RWSEM.count], eax
-
 
282
 
-
 
283
        popfd
-
 
284
        ret
-
 
285
 
-
 
286
;void __fastcall down_write(struct rw_semaphore *sem)
-
 
287
 
-
 
288
align 4
-
 
289
down_write:
-
 
290
        pushfd
-
 
291
        cli
-
 
292
        sub     esp, sizeof.MUTEX_WAITER
-
 
293
 
-
 
294
        mov     edx, [TASK_BASE]
-
 
295
        mov     [esp+MUTEX_WAITER.task], edx
-
 
296
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
-
 
297
        mov     [edx+TASKDATA.state], 1
-
 
298
 
-
 
299
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
-
 
300
 
-
 
301
        xor     eax, eax
-
 
302
        not     eax
-
 
303
 
-
 
304
.forever:
-
 
305
        test    eax, [ecx+RWSEM.count]
-
 
306
        jz      @F
-
 
307
 
-
 
308
        mov     [edx+TASKDATA.state], 1
-
 
309
        call    change_task
-
 
310
        jmp     .forever
-
 
311
@@:
-
 
312
        mov     [ecx+RWSEM.count], eax
-
 
313
        list_del esp
-
 
314
 
-
 
315
        add     esp, sizeof.MUTEX_WAITER
-
 
316
        popfd
-
 
317
        ret
-
 
318
 
-
 
319
;void __fastcall up_read(struct rw_semaphore *sem)
-
 
320
 
-
 
321
align 4
-
 
322
up_read:
-
 
323
        pushfd
-
 
324
        cli
-
 
325
 
-
 
326
        dec     [ecx+RWSEM.count]
-
 
327
        jnz     @F
-
 
328
 
-
 
329
        mov     eax, [ecx+RWSEM.wait_list.next]
-
 
330
        cmp     eax, ecx
-
 
331
        je      @F
-
 
332
 
-
 
333
        mov     eax, [eax+MUTEX_WAITER.task]
-
 
334
        mov     [eax+TASKDATA.state], 0
-
 
335
@@:
-
 
336
        popfd
-
 
337
        ret
-
 
338
 
-
 
339
;void __fastcall up_write(struct rw_semaphore *sem)
-
 
340
 
-
 
341
align 4
-
 
342
up_write:
-
 
343
 
-
 
344
        pushfd
-
 
345
        cli
-
 
346
 
-
 
347
        mov     eax, [ecx+RWSEM.wait_list.next]
-
 
348
        mov     [ecx+RWSEM.count], 0
-
 
349
 
-
 
350
        cmp     ecx, eax
-
 
351
        je      .done
-
 
352
 
-
 
353
        mov     edx, [eax+MUTEX_WAITER.type]
-
 
354
        test    edx, edx
-
 
355
        jnz     .wake
-
 
356
 
-
 
357
        mov     eax, [eax+MUTEX_WAITER.task]
-
 
358
        mov     [eax+TASKDATA.state], 0
-
 
359
.done:
-
 
360
        popfd
-
 
361
        ret
-
 
362
 
-
 
363
.wake:
-
 
364
        push    ebx
-
 
365
        push    esi
-
 
366
        push    edi
-
 
367
 
-
 
368
        xor     esi, esi
-
 
369
        mov     edi, ecx
-
 
370
 
-
 
371
.wake_list:
-
 
372
 
-
 
373
        mov     ebx, [eax+MUTEX_WAITER.list.next]
-
 
374
        list_del eax
-
 
375
        mov     edx, [eax+MUTEX_WAITER.task]
-
 
376
        mov     [edx+TASKDATA.state], 0
-
 
377
        inc     esi
-
 
378
        cmp     edi, ebx
-
 
379
        je      .wake_done
-
 
380
 
-
 
381
        mov     ecx, [ebx+MUTEX_WAITER.type]
-
 
382
        test    ecx, ecx
-
 
383
        jz      .wake_done
-
 
384
 
-
 
385
        mov     eax, ebx
-
 
386
        jmp     .wake_list
-
 
387
 
-
 
388
.wake_done:
-
 
389
        add     [edi+RWSEM.count], esi
-
 
390
 
-
 
391
        pop     edi
-
 
392
        pop     esi
-
 
393
        pop     ebx
-
 
394
        popfd
-
 
395
        ret
-
 
396
 
-
 
397
 
-
 
398
purge MUTEX_WAITER
-
 
Line 399... Line 159...
399
purge RWSEM_WAITING_FOR_WRITE
159
 
400
purge RWSEM_WAITING_FOR_READ
160
 
401
 
161