Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6926 → Rev 6917

/kernel/trunk/posix/futex.inc
File deleted
Property changes:
Deleted: svn:eol-style
-native
\ No newline at end of property
/kernel/trunk/posix/pipe.inc
File deleted
Property changes:
Deleted: svn:eol-style
-native
\ No newline at end of property
/kernel/trunk/posix/posix.inc
File deleted
Property changes:
Deleted: svn:eol-style
-native
\ No newline at end of property
/kernel/trunk/core/syscall.inc
175,7 → 175,7
dd sys_network ; 74-reserved for new stack
dd sys_socket ; 75-reserved for new stack
dd sys_protocols ; 76-reserved for new stack
dd sys_posix ; posix support
dd sys_synchronization ; 77
dd undefined_syscall ; 78-free
dd undefined_syscall ; 79-free
dd fileSystemUnicode ; 80-File system interface for different encodings
/kernel/trunk/core/dll.inc
1437,8 → 1437,6
call free ;release object memory
ret
 
 
;void* __fastcall create_object(size_t size)
; param
; ecx= size
 
1487,33 → 1485,3
xor eax, eax
ret
 
 
;int __fastcall destroy_object(struct object *obj)
 
align 4
destroy_object:
push esi
mov esi, [current_process]
mov edx, [ecx+FUTEX.handle]
 
pushfd
cli
 
mov eax, [esi+PROC.ht_next]
mov [esi+PROC.htab+edx*4], eax
mov [esi+PROC.ht_next], edx
inc [esi+PROC.ht_free]
 
popfd
pop esi
 
mov eax, ecx
call free
xor eax, eax
ret
.fail:
popfd
pop esi
mov eax, -1
ret
 
/kernel/trunk/core/sync.inc
9,8 → 9,257
 
$Revision$
 
align 4
;struct futex* __fastcall create_futex(int *ptr)
create_futex:
push ecx
mov ecx, sizeof.FUTEX
call create_object
pop ecx
test eax, eax
jz .fail
 
mov [eax+FUTEX.magic], 'FUTX'
mov [eax+FUTEX.destroy], 0
mov [eax+FUTEX.pointer], ecx
lea ecx, [eax+FUTEX.wait_list]
list_init ecx
mov [eax+FUTEX.flags], 0
.fail:
ret
 
align 4
;int __fastcall destroy_futex(struct futex *futex)
destroy_futex:
push esi
mov esi, [current_process]
mov edx, [ecx+FUTEX.handle]
 
pushfd
cli
 
lea eax, [ecx+FUTEX.wait_list]
cmp eax, [eax+LHEAD.next]
jne .fail
 
mov eax, [esi+PROC.ht_next]
mov [esi+PROC.htab+edx*4], eax
mov [esi+PROC.ht_next], edx
inc [esi+PROC.ht_free]
 
popfd
pop esi
 
mov eax, ecx
call free
xor eax, eax
ret
 
.fail:
popfd
pop esi
mov eax, -1
ret
 
 
iglobal
align 4
f77call:
dd f77.futex_init ;0
dd f77.futex_destroy ;1
dd f77.futex_wait ;2
dd f77.futex_wake ;3
.end:
endg
 
align 4
sys_synchronization:
f77:
test ebx, ebx
jz .futex_init
 
cmp ebx, (f77call.end-f77call)/4
jae .fail
 
cmp ecx, STDERR_FILENO
jbe .fail
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
jae .fail
 
mov edi, [current_process]
mov ebp, [edi+PROC.htab+ecx*4]
 
cmp [ebp+FUTEX.magic], 'FUTX'
jne .fail
cmp [ebp+FUTEX.handle], ecx
jne .fail
 
jmp dword [f77call+ebx*4]
 
.fail:
mov [esp+SYSCALL_STACK._eax], -1
ret
 
align 4
.futex_init:
call create_futex
test eax, eax
jz @F
mov eax, [eax+FUTEX.handle]
@@:
mov [esp+SYSCALL_STACK._eax], eax
ret
 
 
align 4
;ecx futex handle
;edi current process
;ebp futex object
.futex_destroy:
mov ecx, ebp
call destroy_futex
mov [esp+SYSCALL_STACK._eax], eax
ret
 
align 4
;ecx futex handle
;edx control value
;esi timeout
;edi current process
;ebp futex object
.futex_wait:
test esi, esi
jnz .futex_wait_timeout
mov ecx, [ebp+FUTEX.pointer]
mov eax, edx
lock cmpxchg [ecx], edx
je .wait_slow
 
mov [esp+SYSCALL_STACK._eax], -2
ret
 
.wait_slow:
pushfd
cli
 
sub esp, sizeof.MUTEX_WAITER
mov ebx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], ebx
lea esi, [ebp+FUTEX.wait_list]
 
list_add_tail esp, esi ;esp= new waiter, esi= list head
mov eax, edx
.again:
mov [ebx+TASKDATA.state], 1
call change_task
 
lock cmpxchg [ecx], edx
je .again
 
list_del esp
add esp, sizeof.MUTEX_WAITER
 
popfd
mov [esp+SYSCALL_STACK._eax], 0
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
je .wait_slow_timeout
 
mov [esp+SYSCALL_STACK._eax], -2
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], eax
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
 
mov eax, edx
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
;ecx futex handle
;edx number of threads
;edi current process
;ebp futex object
.futex_wake:
 
xor ecx, ecx
 
pushfd
cli
 
lea ebx, [ebp+FUTEX.wait_list]
mov esi, [ebx+LHEAD.next]
.wake:
cmp esi, ebx
je .done
 
mov eax, [esi+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
 
mov esi, [esi+MUTEX_WAITER.list.next]
inc ecx
cmp ecx, edx
jb .wake
.done:
popfd
mov [esp+SYSCALL_STACK._eax], ecx
ret
 
RWSEM_WAITING_FOR_WRITE equ 0
RWSEM_WAITING_FOR_READ equ 1
 
/kernel/trunk/kernel32.inc
27,8 → 27,6
include "core/timers.inc"
include "core/clipboard.inc"
 
include "posix/posix.inc"
 
include "boot/shutdown.inc" ; kernel shutdown
 
include "video/vesa20.inc"
/kernel/trunk/const.inc
413,29 → 413,6
FUTEX_WAIT equ 2
FUTEX_WAKE equ 3
 
struct FILED
list LHEAD
magic rd 1
handle rd 1
destroy rd 1
file rd 1
ends
 
struct PIPE
pipe_ops rd 1
buffer rd 1
readers rd 1
writers rd 1
 
pipe_lock MUTEX
count rd 1
 
read_end rd 1
write_end rd 1
rlist LHEAD
wlist LHEAD
ends
 
struct PROC
list LHEAD
thr_list LHEAD