Subversion Repositories Kolibri OS

Rev

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

Rev 2166 Rev 2434
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: 2166 $
8
$Revision: 2434 $
9
 
9
 
10
 
10
 
Line 58... Line 58...
58
.find_next_task:
58
.find_next_task:
59
; \end{Mario79}
59
; \end{Mario79}
60
end if
60
end if
61
        call    find_next_task
61
        call    find_next_task
62
        jz      .return  ; the same task -> skip switch
62
        jz      .return  ; the same task -> skip switch
-
 
63
  @@:
63
  @@:   mov     byte[DONT_SWITCH], 1
64
        mov     byte[DONT_SWITCH], 1
64
        call    do_change_task
65
        call    do_change_task
65
  .return:
66
  .return:
66
        popad
67
        popad
67
        popfd
68
        popfd
68
        ret
69
        ret
Line 119... Line 120...
119
  .loop:
120
  .loop:
120
        cmp     bh,[TASK_COUNT]
121
        cmp     bh, [TASK_COUNT]
121
        jb      @f
122
        jb      @f
122
        xor     bh, bh
123
        xor     bh, bh
123
        mov     edi,CURRENT_TASK
124
        mov     edi, CURRENT_TASK
-
 
125
  @@:
124
  @@:   inc     bh       ; ebx += APPDATA.size
126
        inc     bh       ; ebx += APPDATA.size
125
        add     edi,0x20 ; edi += TASKDATA.size
127
        add     edi, 0x20; edi += TASKDATA.size
126
        mov     al, [edi+TASKDATA.state]
128
        mov     al, [edi+TASKDATA.state]
127
        test    al, al
129
        test    al, al
128
        jz      .found   ; state == 0
130
        jz      .found   ; state == 0
129
        cmp     al, 5
131
        cmp     al, 5
Line 138... Line 140...
138
      ; testing for timeout
140
      ; testing for timeout
139
        mov     ecx, [timer_ticks]
141
        mov     ecx, [timer_ticks]
140
        sub     ecx, [ebx+APPDATA.wait_begin]
142
        sub     ecx, [ebx+APPDATA.wait_begin]
141
        cmp     ecx, [ebx+APPDATA.wait_timeout]
143
        cmp     ecx, [ebx+APPDATA.wait_timeout]
142
        jb      .loop
144
        jb      .loop
-
 
145
  @@:
143
  @@:   mov     [ebx+APPDATA.wait_param], eax  ; retval for wait
146
        mov     [ebx+APPDATA.wait_param], eax  ; retval for wait
144
        mov     [edi+TASKDATA.state], 0
147
        mov     [edi+TASKDATA.state], 0
145
  .found:
148
  .found:
146
        mov     [CURRENT_TASK],bh
149
        mov     [CURRENT_TASK], bh
147
        mov     [TASK_BASE],edi
150
        mov     [TASK_BASE], edi
148
        rdtsc   ;call  _rdtsc
151
        rdtsc   ;call  _rdtsc
Line 212... Line 215...
212
  macro lodsReg [reg] {
215
  macro lodsReg [reg] {
213
        lodsd
216
        lodsd
214
        mov     reg,eax
217
        mov     reg, eax
215
  }     lodsReg dr0, dr1, dr2, dr3, dr7
218
  }     lodsReg dr0, dr1, dr2, dr3, dr7
216
  purge lodsReg
219
  purge lodsReg
-
 
220
  @@:
217
  @@:   ret
221
        ret
218
;end.
222
;end.
Line 219... Line 223...
219
 
223
 
220
 
-
 
221
 
224
 
222
struc MUTEX_WAITER
225
 
223
{
-
 
224
    .list   LHEAD
226
struct  MUTEX_WAITER
225
    .task   rd 1
-
 
226
    .sizeof:
-
 
227
};
-
 
228
 
-
 
Line 229... Line 227...
229
virtual at 0
227
        list    LHEAD
Line 230... Line 228...
230
 MUTEX_WAITER MUTEX_WAITER
228
        task    dd ?
231
end virtual
229
ends
232
 
230
 
233
;void  __fastcall mutex_init(struct mutex *lock)
231
;void  __fastcall mutex_init(struct mutex *lock)
234
 
232
 
235
align 4
233
align 4
Line 236... Line 234...
236
mutex_init:
234
mutex_init:
Line 249... Line 247...
249
        jns .done
247
        jns     .done
Line 250... Line 248...
250
 
248
 
251
        pushfd
249
        pushfd
Line 252... Line 250...
252
        cli
250
        cli
Line 253... Line 251...
253
 
251
 
Line 254... Line 252...
254
        sub esp, MUTEX_WAITER.sizeof
252
        sub     esp, sizeof.MUTEX_WAITER
255
 
253
 
Line 272... Line 270...
272
        mov edx, [esp+MUTEX_WAITER.list.next]
270
        mov     edx, [esp+MUTEX_WAITER.list.next]
273
        mov eax, [esp+MUTEX_WAITER.list.prev]
271
        mov     eax, [esp+MUTEX_WAITER.list.prev]
Line 274... Line 272...
274
 
272
 
275
        mov [eax+MUTEX_WAITER.list.next], edx
273
        mov     [eax+MUTEX_WAITER.list.next], edx
276
        mov [edx+MUTEX_WAITER.list.prev], eax
274
        mov     [edx+MUTEX_WAITER.list.prev], eax
277
        cmp [ecx+MUTEX.wait.next], ecx
275
        cmp     [ecx+MUTEX.lhead.next], ecx
Line 278... Line 276...
278
        jne @F
276
        jne     @F
279
 
277
 
280
        mov [ecx+MUTEX.count], 0
278
        mov     [ecx+MUTEX.count], 0
Line 281... Line 279...
281
@@:
279
@@:
282
        add  esp, MUTEX_WAITER.sizeof
280
        add     esp, sizeof.MUTEX_WAITER
283
 
281
 
Line 291... Line 289...
291
mutex_unlock:
289
mutex_unlock:
Line 292... Line 290...
292
 
290
 
293
        pushfd
291
        pushfd
Line 294... Line 292...
294
        cli
292
        cli
295
 
293
 
296
        mov eax, [ecx+MUTEX.wait.next]
294
        mov     eax, [ecx+MUTEX.lhead.next]
297
        cmp eax, ecx
295
        cmp     eax, ecx
Line 298... Line 296...
298
        mov [ecx+MUTEX.count], 1
296
        mov     [ecx+MUTEX.count], 1