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:
root 2025-05-21 09:23:48 +00:00
parent c16c82b15f
commit fc1cc26b0f
2 changed files with 194 additions and 42 deletions

15
main.s
View file

@ -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