rewrite client__pollout
algorithm: 1. call client__pollout__before_fresh_lines 2. if error, return 3. find line length 4. if no line, set POLLIN and goto 8 5. call client__pollout__line 6. if error, goto 7 7. finished with this line; goto 3 8. move the final incomplete line to the start of the client's buffer 9. return
This commit is contained in:
parent
c16c82b15f
commit
fc1cc26b0f
2 changed files with 194 additions and 42 deletions
15
main.s
15
main.s
|
@ -26,6 +26,7 @@ POLLERR equ 8
|
|||
POLLNVAL equ 32
|
||||
; TODO(?) POLLPRI: see poll(2), tcp(7)
|
||||
SHUT_RDWR equ 2
|
||||
EAGAIN equ -11
|
||||
|
||||
;STATE_READING equ 0
|
||||
;STATE_WRITING equ 1
|
||||
|
@ -34,14 +35,18 @@ SHUT_RDWR equ 2
|
|||
OFFSET_CLIENT_FD equ 0
|
||||
OFFSET_CLIENT_STATE equ 4
|
||||
OFFSET_CLIENT_BUFFER_LEN equ 5
|
||||
OFFSET_CLIENT_BUFFER equ 6
|
||||
OFFSET_CLIENT_SCRATCH_LEN equ 6
|
||||
OFFSET_CLIENT_BUFFER equ 7
|
||||
OFFSET_CLIENT_SCRATCH equ 7 + client_buffer_size
|
||||
|
||||
pollfd_size equ 4 + 2 + 2 ; $ man 2 poll
|
||||
pollfds_capacity equ 100
|
||||
|
||||
client_buffer_size equ 255
|
||||
; fd, state, buffer_len, buffer
|
||||
client_size equ 4 + 2 + client_buffer_size
|
||||
client_scratch_size equ 255
|
||||
|
||||
; fd, state, buffer_len, scratch_len, buffer, scratch
|
||||
client_size equ 4 + 2 + client_buffer_size + client_scratch_size
|
||||
clients_capacity equ pollfds_capacity - 1
|
||||
|
||||
SECTION .data
|
||||
|
@ -158,8 +163,12 @@ _client__pollout:
|
|||
mov rsi, r12
|
||||
mov rdx, r15
|
||||
call client__pollout
|
||||
cmp rax, EAGAIN
|
||||
je _client__pollout__finished
|
||||
cmp rax, 0
|
||||
jle _client__error_or_eof
|
||||
|
||||
_client__pollout__finished:
|
||||
add r15, 1
|
||||
jmp scan__loop
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue