Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6926 → Rev 6927

/kernel/trunk/posix/pipe.inc
140,6 → 140,8
align 4
pipe_read:
mov edi, edx
 
.again:
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_lock
 
161,9 → 163,9
mov [esp+SYSCALL_STACK._eax], ecx
sub [ebp+PIPE.count], ecx
cld
rep stosb
rep movsb
and esi, 0xFFF
add [ebp+PIPE.read_end], esi
mov [ebp+PIPE.read_end], esi
 
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
170,7 → 172,6
ret
 
.wait:
 
sub esp, sizeof.MUTEX_WAITER
mov ebx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], ebx
178,7 → 179,6
 
list_add_tail esp, edx ;esp= new waiter, edx= list head
 
.again:
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
 
185,26 → 185,79
mov [ebx+TASKDATA.state], 1
call change_task
 
list_del esp
add esp, sizeof.MUTEX_WAITER
jmp .again
 
.eof:
mov [esp+SYSCALL_STACK._eax], eax
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
ret
 
; edx buf
; esi count
; ebp pipe
 
align 4
pipe_write:
mov edi, edx
 
.again:
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_lock
 
xor eax, eax
cmp eax, [ebp+PIPE.readers]
je .epipe
 
mov ecx, [ebp+PIPE.count]
test ecx, ecx
jz .again
sub ecx, 4096
jz .wait
 
.check_count:
cmp ecx, esi
jb .write
mov ecx, esi
.write:
mov esi, [ebp+PIPE.buffer]
add esi, [ebp+PIPE.write_end]
mov [esp+SYSCALL_STACK._eax], ecx
add [ebp+PIPE.count], ecx
cld
rep movsb
and esi, 0xFFF
mov [ebp+PIPE.write_end], esi
 
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
ret
 
.wait:
sub esp, sizeof.MUTEX_WAITER
mov ebx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], ebx
lea edx, [ebp+PIPE.wlist]
 
list_add_tail esp, edx ;esp= new waiter, edx= list head
 
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
 
mov [ebx+TASKDATA.state], 1
call change_task
 
list_del esp
add esp, sizeof.MUTEX_WAITER
jmp .check_count
jmp .again
 
.eof:
mov [esp+SYSCALL_STACK._eax], eax
.epipe:
mov [esp+SYSCALL_STACK._eax], -EPIPE
lea ecx, [ebp+PIPE.pipe_lock]
call mutex_unlock
ret
 
 
align 4
pipe_close:
pipe_write:
mov [esp+SYSCALL_STACK._eax], -EBADF
ret