60,8 → 60,7 |
end if |
call find_next_task |
jz .return ; the same task -> skip switch |
@@: |
mov byte[DONT_SWITCH], 1 |
@@: mov byte[DONT_SWITCH], 1 |
call do_change_task |
.return: |
popad |
122,8 → 121,7 |
jb @f |
xor bh, bh |
mov edi, CURRENT_TASK |
@@: |
inc bh ; ebx += APPDATA.size |
@@: inc bh ; ebx += APPDATA.size |
add edi, 0x20; edi += TASKDATA.size |
mov al, [edi+TASKDATA.state] |
test al, al |
142,8 → 140,7 |
sub ecx, [ebx+APPDATA.wait_begin] |
cmp ecx, [ebx+APPDATA.wait_timeout] |
jb .loop |
@@: |
mov [ebx+APPDATA.wait_param], eax ; retval for wait |
@@: mov [ebx+APPDATA.wait_param], eax ; retval for wait |
mov [edi+TASKDATA.state], 0 |
.found: |
mov [CURRENT_TASK], bh |
217,23 → 214,28 |
mov reg, eax |
} lodsReg dr0, dr1, dr2, dr3, dr7 |
purge lodsReg |
@@: |
ret |
@@: ret |
;end. |
|
|
|
struct MUTEX_WAITER |
list LHEAD |
task dd ? |
ends |
struc MUTEX_WAITER |
{ |
.list LHEAD |
.task rd 1 |
.sizeof: |
}; |
|
virtual at 0 |
MUTEX_WAITER MUTEX_WAITER |
end virtual |
|
;void __fastcall mutex_init(struct mutex *lock) |
|
align 4 |
mutex_init: |
mov [ecx+MUTEX.lhead.next], ecx |
mov [ecx+MUTEX.lhead.prev], ecx |
mov [ecx+MUTEX.wait.next], ecx |
mov [ecx+MUTEX.wait.prev], ecx |
mov [ecx+MUTEX.count], 1 |
ret |
|
249,7 → 251,7 |
pushfd |
cli |
|
sub esp, sizeof.MUTEX_WAITER |
sub esp, MUTEX_WAITER.sizeof |
|
list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
|
272,12 → 274,12 |
|
mov [eax+MUTEX_WAITER.list.next], edx |
mov [edx+MUTEX_WAITER.list.prev], eax |
cmp [ecx+MUTEX.lhead.next], ecx |
cmp [ecx+MUTEX.wait.next], ecx |
jne @F |
|
mov [ecx+MUTEX.count], 0 |
@@: |
add esp, sizeof.MUTEX_WAITER |
add esp, MUTEX_WAITER.sizeof |
|
popfd |
.done: |
291,7 → 293,7 |
pushfd |
cli |
|
mov eax, [ecx+MUTEX.lhead.next] |
mov eax, [ecx+MUTEX.wait.next] |
cmp eax, ecx |
mov [ecx+MUTEX.count], 1 |
je @F |