forked from KolibriOS/kolibrios
kolibri-acpi: futex_wait_timeout
git-svn-id: svn://kolibrios.org@5599 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
4e9602a915
commit
f5f30ba226
@ -16,7 +16,8 @@ $Revision$
|
|||||||
align 32
|
align 32
|
||||||
irq0:
|
irq0:
|
||||||
pushad
|
pushad
|
||||||
Mov ds, ax, app_data
|
mov ax, app_data
|
||||||
|
mov ds, ax
|
||||||
mov es, ax
|
mov es, ax
|
||||||
inc [timer_ticks]
|
inc [timer_ticks]
|
||||||
mov eax, [timer_ticks]
|
mov eax, [timer_ticks]
|
||||||
@ -101,8 +102,10 @@ do_change_task:
|
|||||||
mov [esi+APPDATA.saved_esp], esp
|
mov [esi+APPDATA.saved_esp], esp
|
||||||
mov esp, [ebx+APPDATA.saved_esp]
|
mov esp, [ebx+APPDATA.saved_esp]
|
||||||
; set new thread io-map
|
; set new thread io-map
|
||||||
Mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)],eax,[ebx+APPDATA.io_map]
|
mov eax, [ebx+APPDATA.io_map]
|
||||||
Mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)],eax,[ebx+APPDATA.io_map+4]
|
mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)], eax
|
||||||
|
mov eax, [ebx+APPDATA.io_map+4]
|
||||||
|
mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)], eax
|
||||||
; set new thread memory-map
|
; set new thread memory-map
|
||||||
mov eax, [ebx+APPDATA.process]
|
mov eax, [ebx+APPDATA.process]
|
||||||
cmp eax, [current_process]
|
cmp eax, [current_process]
|
||||||
@ -113,7 +116,8 @@ do_change_task:
|
|||||||
@@:
|
@@:
|
||||||
; set tss.esp0
|
; set tss.esp0
|
||||||
|
|
||||||
Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0]
|
mov eax, [ebx+APPDATA.saved_esp0]
|
||||||
|
mov [tss._esp0], eax
|
||||||
|
|
||||||
mov edx, [ebx+APPDATA.tls_base]
|
mov edx, [ebx+APPDATA.tls_base]
|
||||||
|
|
||||||
@ -126,7 +130,8 @@ do_change_task:
|
|||||||
mov fs, dx
|
mov fs, dx
|
||||||
|
|
||||||
; set gs selector unconditionally
|
; set gs selector unconditionally
|
||||||
Mov gs,ax,graph_data
|
Mov ax, graph_data
|
||||||
|
Mov gs, ax
|
||||||
; set CR0.TS
|
; set CR0.TS
|
||||||
cmp bh, byte[fpu_owner] ;bh == incoming task (new)
|
cmp bh, byte[fpu_owner] ;bh == incoming task (new)
|
||||||
clts ;clear a task switch flag
|
clts ;clear a task switch flag
|
||||||
@ -280,7 +285,7 @@ proc find_next_task
|
|||||||
call [ebx+APPDATA.wait_test]
|
call [ebx+APPDATA.wait_test]
|
||||||
mov [esp+28], eax
|
mov [esp+28], eax
|
||||||
popad
|
popad
|
||||||
or eax, eax
|
test eax, eax
|
||||||
jnz @f
|
jnz @f
|
||||||
; testing for timeout
|
; testing for timeout
|
||||||
mov eax, [timer_ticks]
|
mov eax, [timer_ticks]
|
||||||
|
@ -86,12 +86,12 @@ f77:
|
|||||||
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
|
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
|
||||||
jae .fail
|
jae .fail
|
||||||
|
|
||||||
mov esi, [current_process]
|
mov edi, [current_process]
|
||||||
mov edi, [esi+PROC.htab+ecx*4]
|
mov ebp, [edi+PROC.htab+ecx*4]
|
||||||
|
|
||||||
cmp [edi+FUTEX.magic], 'FUTX'
|
cmp [ebp+FUTEX.magic], 'FUTX'
|
||||||
jne .fail
|
jne .fail
|
||||||
cmp [edi+FUTEX.handle], ecx
|
cmp [ebp+FUTEX.handle], ecx
|
||||||
jne .fail
|
jne .fail
|
||||||
|
|
||||||
jmp dword [f77call+ebx*4]
|
jmp dword [f77call+ebx*4]
|
||||||
@ -113,21 +113,24 @@ align 4
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
;ecx futex handle
|
;ecx futex handle
|
||||||
;esi current process
|
;edi current process
|
||||||
;edi futex object
|
;ebp futex object
|
||||||
.futex_destroy:
|
.futex_destroy:
|
||||||
mov ecx, edi
|
mov ecx, ebp
|
||||||
call destroy_futex
|
call destroy_futex
|
||||||
mov [esp+SYSCALL_STACK._eax], eax
|
mov [esp+SYSCALL_STACK._eax], eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
;ecx futex handle
|
;ecx futex handle
|
||||||
;esi current process
|
|
||||||
;edi futex object
|
|
||||||
;edx control value
|
;edx control value
|
||||||
|
;esi timeout
|
||||||
|
;edi current process
|
||||||
|
;ebp futex object
|
||||||
.futex_wait:
|
.futex_wait:
|
||||||
mov ecx, [edi+FUTEX.pointer]
|
test esi, esi
|
||||||
|
jnz .futex_wait_timeout
|
||||||
|
mov ecx, [ebp+FUTEX.pointer]
|
||||||
mov eax, edx
|
mov eax, edx
|
||||||
lock cmpxchg [ecx], edx ;wait until old_value == new_value
|
lock cmpxchg [ecx], edx ;wait until old_value == new_value
|
||||||
jz .wait_slow
|
jz .wait_slow
|
||||||
@ -143,7 +146,7 @@ align 4
|
|||||||
mov ebx, [TASK_BASE]
|
mov ebx, [TASK_BASE]
|
||||||
mov [ebx+TASKDATA.state], 1
|
mov [ebx+TASKDATA.state], 1
|
||||||
mov [esp+MUTEX_WAITER.task], ebx
|
mov [esp+MUTEX_WAITER.task], ebx
|
||||||
lea esi, [edi+FUTEX.wait_list]
|
lea esi, [ebp+FUTEX.wait_list]
|
||||||
|
|
||||||
list_add_tail esp, esi ;esp= new waiter, esi= list head
|
list_add_tail esp, esi ;esp= new waiter, esi= list head
|
||||||
|
|
||||||
@ -160,6 +163,72 @@ align 4
|
|||||||
mov [esp+SYSCALL_STACK._eax], 0
|
mov [esp+SYSCALL_STACK._eax], 0
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;ecx futex handle
|
||||||
|
;edx control value
|
||||||
|
;esi timeout
|
||||||
|
;edi current process
|
||||||
|
;ebp futex object
|
||||||
|
|
||||||
|
.futex_wait_timeout:
|
||||||
|
mov ecx, [ebp+FUTEX.pointer]
|
||||||
|
mov eax, edx
|
||||||
|
lock cmpxchg [ecx], edx ;wait until old_value == new_value
|
||||||
|
jz .wait_slow_timeout
|
||||||
|
|
||||||
|
mov [esp+SYSCALL_STACK._eax], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
.wait_test:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.wait_slow_timeout:
|
||||||
|
pushfd
|
||||||
|
cli
|
||||||
|
|
||||||
|
sub esp, sizeof.MUTEX_WAITER
|
||||||
|
|
||||||
|
mov ebx, [current_slot]
|
||||||
|
mov [ebx+APPDATA.wait_test], f77.wait_test
|
||||||
|
mov [ebx+APPDATA.wait_timeout], esi
|
||||||
|
mov [ebx+APPDATA.wait_param], ebp
|
||||||
|
mov eax, [timer_ticks]
|
||||||
|
mov [ebx+APPDATA.wait_begin], eax
|
||||||
|
mov eax, [TASK_BASE]
|
||||||
|
mov [eax+TASKDATA.state], 5
|
||||||
|
|
||||||
|
mov [esp+MUTEX_WAITER.task], ebx
|
||||||
|
lea esi, [ebp+FUTEX.wait_list]
|
||||||
|
|
||||||
|
list_add_tail esp, esi ;esp= new waiter, esi= list head
|
||||||
|
|
||||||
|
.again_timeout:
|
||||||
|
call change_task
|
||||||
|
mov eax, [ebx+APPDATA.wait_param]
|
||||||
|
test eax, eax
|
||||||
|
jz .timeout
|
||||||
|
|
||||||
|
lock cmpxchg [ecx], edx
|
||||||
|
jz .again_timeout
|
||||||
|
@@:
|
||||||
|
list_del esp
|
||||||
|
add esp, sizeof.MUTEX_WAITER
|
||||||
|
|
||||||
|
popfd
|
||||||
|
mov [esp+SYSCALL_STACK._eax], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
.timeout:
|
||||||
|
list_del esp
|
||||||
|
add esp, sizeof.MUTEX_WAITER
|
||||||
|
|
||||||
|
popfd
|
||||||
|
mov [esp+SYSCALL_STACK._eax], -1
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
;ecx futex handle
|
;ecx futex handle
|
||||||
;esi current process
|
;esi current process
|
||||||
|
@ -104,7 +104,8 @@ align 4
|
|||||||
mov [eax+EVENT.state], ecx
|
mov [eax+EVENT.state], ecx
|
||||||
mov [eax+EVENT.pid], edx
|
mov [eax+EVENT.pid], edx
|
||||||
inc [event_uid]
|
inc [event_uid]
|
||||||
Mov [eax+EVENT.id],edx,[event_uid]
|
mov edx, [event_uid]
|
||||||
|
mov [eax+EVENT.id], edx
|
||||||
or esi, esi
|
or esi, esi
|
||||||
jz RemoveEventTo
|
jz RemoveEventTo
|
||||||
lea edi, [eax+EVENT.code]
|
lea edi, [eax+EVENT.code]
|
||||||
@ -277,7 +278,8 @@ Wait_events_ex:
|
|||||||
jnz @f ;RET
|
jnz @f ;RET
|
||||||
mov [esi+APPDATA.wait_test], edx
|
mov [esi+APPDATA.wait_test], edx
|
||||||
mov [esi+APPDATA.wait_timeout], ebx
|
mov [esi+APPDATA.wait_timeout], ebx
|
||||||
Mov [esi+APPDATA.wait_begin],eax,[timer_ticks]
|
mov eax, [timer_ticks]
|
||||||
|
mov [esi+APPDATA.wait_begin], eax
|
||||||
mov eax, [TASK_BASE]
|
mov eax, [TASK_BASE]
|
||||||
mov [eax+TASKDATA.state], 5
|
mov [eax+TASKDATA.state], 5
|
||||||
call change_task
|
call change_task
|
||||||
|
@ -83,11 +83,6 @@ end if
|
|||||||
}
|
}
|
||||||
; \end{diamond}[29.09.2006]
|
; \end{diamond}[29.09.2006]
|
||||||
|
|
||||||
macro Mov op1,op2,op3 ; op1 = op2 = op3
|
|
||||||
{
|
|
||||||
mov op2, op3
|
|
||||||
mov op1, op2
|
|
||||||
}
|
|
||||||
|
|
||||||
macro list_init head
|
macro list_init head
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user