Subversion Repositories Kolibri OS

Rev

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

Rev 1298 Rev 1434
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. 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: 1298 $
8
$Revision: 1434 $
9
 
9
 
10
 
10
 
Line 215... Line 215...
215
  }     lodsReg dr0, dr1, dr2, dr3, dr7
215
  }     lodsReg dr0, dr1, dr2, dr3, dr7
216
  purge lodsReg
216
  purge lodsReg
217
  @@:   ret
217
  @@:   ret
218
;end.
218
;end.
Line -... Line 219...
-
 
219
 
-
 
220
 
-
 
221
 
-
 
222
struc MUTEX_WAITER
-
 
223
{
-
 
224
    .next   rd 1
-
 
225
    .prev   rd 1
-
 
226
    .task   rd 1
-
 
227
    .sizeof:
-
 
228
};
-
 
229
 
-
 
230
virtual at 0
-
 
231
 MUTEX_WAITER MUTEX_WAITER
-
 
232
end virtual
-
 
233
 
-
 
234
;void  __fastcall mutex_init(struct mutex *lock)
-
 
235
 
-
 
236
align 4
-
 
237
mutex_init:
-
 
238
        lea eax, [ecx+MUTEX.next]
-
 
239
        mov [ecx+MUTEX.count],1
-
 
240
        mov [ecx+MUTEX.next], eax
-
 
241
        mov [ecx+MUTEX.prev], eax
-
 
242
        ret
-
 
243
 
-
 
244
 
-
 
245
;void  __fastcall mutex_lock(struct mutex *lock)
-
 
246
 
-
 
247
align 4
-
 
248
mutex_lock:
-
 
249
 
-
 
250
        dec [ecx+MUTEX.count]
-
 
251
        jns .done
-
 
252
 
-
 
253
        pushfd
-
 
254
        cli
-
 
255
 
-
 
256
        push esi
-
 
257
        sub esp, MUTEX_WAITER.sizeof
-
 
258
 
-
 
259
        mov eax, [ecx+MUTEX.prev]
-
 
260
        lea esi, [ecx+MUTEX.next]
-
 
261
 
-
 
262
        mov [ecx+MUTEX.prev], esp
-
 
263
        mov [esp+MUTEX_WAITER.next],  esi
-
 
264
        mov [esp+MUTEX_WAITER.prev],  eax
-
 
265
        mov [eax], esp
-
 
266
 
-
 
267
        mov edx, [TASK_BASE]
-
 
268
        mov [esp+MUTEX_WAITER.task], edx
-
 
269
 
-
 
270
.forever:
-
 
271
 
-
 
272
        mov eax, -1
-
 
273
        xchg eax, [ecx+MUTEX.count]
-
 
274
        dec eax
-
 
275
        jz @F
-
 
276
 
-
 
277
        mov [edx+TASKDATA.state], 1
-
 
278
        call change_task
-
 
279
        jmp .forever
-
 
280
@@:
-
 
281
        mov edx, [esp+MUTEX_WAITER.next]
-
 
282
        mov eax, [esp+MUTEX_WAITER.prev]
-
 
283
 
-
 
284
        mov [eax+MUTEX_WAITER.next], edx
-
 
285
        cmp [ecx+MUTEX.next], esi
-
 
286
        mov [edx+MUTEX_WAITER.prev], eax
-
 
287
        jne @F
-
 
288
 
-
 
289
        mov [ecx+MUTEX.count], 0
-
 
290
@@:
-
 
291
        add  esp, MUTEX_WAITER.sizeof
-
 
292
 
-
 
293
        pop esi
-
 
294
        popfd
-
 
295
.done:
-
 
296
        ret
-
 
297
 
-
 
298
;void  __fastcall mutex_unlock(struct mutex *lock)
-
 
299
 
-
 
300
align 4
-
 
301
mutex_unlock:
-
 
302
 
-
 
303
        pushfd
-
 
304
        cli
-
 
305
 
-
 
306
        lea eax, [ecx+MUTEX.next]
-
 
307
        cmp eax, [ecx+MUTEX.next]
-
 
308
        mov [ecx+MUTEX.count], 1
-
 
309
        je @F
-
 
310
 
-
 
311
        mov eax, [eax+MUTEX_WAITER.task]
-
 
312
        mov [eax+TASKDATA.state], 0
-
 
313
@@:
-
 
314
        popfd
-
 
315
        ret
-
 
316
 
-
 
317
 
-
 
318
purge MUTEX_WAITER
219
 
319
 
-
 
320
if 0
220
if 0
321
 
221
struc TIMER
322
struc TIMER
222
{
323
{
223
  .next      dd ?
324
  .next      dd ?
224
  .exp_time  dd ?
325
  .exp_time  dd ?