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 |