Skip to content

Commit 9f84ba6

Browse files
committed
Separate acceptor loop for picov
Enable nodejs build [docker verify]
1 parent 2877104 commit 9f84ba6

File tree

3 files changed

+61
-40
lines changed

3 files changed

+61
-40
lines changed

.github/workflows/ci-nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ concurrency:
1414
jobs:
1515
build:
1616
runs-on: ubuntu-latest
17-
if: "contains(github.event.head_commit.message, '[build_only_nodejs]')"
17+
if: "!contains(github.event.head_commit.message, '[skip_build]')"
1818
steps:
1919
- uses: actions/checkout@v4
2020
- name: Build ffead-cpp with nodejs backend

lang-server-backends/v/pico.v/main.v

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ pub mut:
5858
}
5959

6060
struct C.ffead_request3_t {}
61-
6261
/*
6362
const ffead_request3 *request, int* scode, const char** smsg, size_t *smsg_len,
6463
const char **out_mime, size_t *out_mime_len, const char **out_url, size_t *out_url_len,
@@ -70,7 +69,6 @@ fn C.ffead_cpp_handle_picov_2_init_sock(int, voidptr) voidptr
7069
fn C.ffead_cpp_handle_picov_2_deinit_sock(int, voidptr)
7170
fn C.ffead_cpp_handle_picov_ext_fd_cb(int, voidptr)
7271
fn C.ffead_cpp_handle_picov_clean_sockets()
73-
7472
fn C.ffead_cpp_resp_cleanup(voidptr)
7573

7674
fn cpy_str_1(dst byteptr, src string) byteptr {
@@ -295,9 +293,9 @@ fn main() {
295293
println('Bootstrapping ffead-cpp end...')
296294

297295
if is_async {
298-
mut pv = picoev.new(server_port, &callback_async, &open_cb_async, &close_cb_async, &C.ffead_cpp_handle_picov_ext_fd_cb, true)
296+
mut pv = picoev.new(server_port, &callback_async, &open_cb_async, &close_cb_async, &C.ffead_cpp_handle_picov_ext_fd_cb, true, true)
299297
} else {
300-
mut pv = picoev.new(server_port, &callback, &open_cb_async, &close_cb_async, &C.ffead_cpp_handle_picov_ext_fd_cb, false)
298+
mut pv = picoev.new(server_port, &callback, &open_cb_async, &close_cb_async, &C.ffead_cpp_handle_picov_ext_fd_cb, false, true)
301299
}
302300

303301
println('Initializing ffead-cpp start...')
@@ -319,7 +317,7 @@ fn main() {
319317

320318
println('Initializing ffead-cpp end...')
321319

322-
pv.listen(server_port, is_async)
320+
pv.listen(server_port)
323321
println('Listening on port $server_port ...')
324322
pv.serve()
325323

lang-server-backends/v/pico.v/picoev.v

Lines changed: 57 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,15 @@ struct C.picoev_loop {}
6565

6666
struct Picoev {
6767
loop &C.picoev_loop
68+
is_async bool
69+
is_cloop bool
6870
cb fn(req picohttpparser.Request, mut res picohttpparser.Response)
6971
cb1 fn(req picohttpparser.Request, fd int, pv voidptr)
7072
open_cb fn(fd int) voidptr
7173
close_cb fn(fd int, fd_data voidptr)
7274
cb_ext_fd_cb fn(int, voidptr)
7375
pub mut:
76+
cloop &C.picoev_loop
7477
date byteptr
7578
buf byteptr
7679
idx [2048]int
@@ -213,6 +216,15 @@ fn accept_callback(loop &C.picoev_loop, fd, events int, cb_arg voidptr) {
213216
}
214217
}
215218

219+
fn accept_callback_cloop(loop &C.picoev_loop, fd, events int, cb_arg voidptr) {
220+
newfd := C.accept(fd, 0, 0)
221+
if newfd != -1 {
222+
setup_sock(newfd)
223+
mut p := &Picoev(cb_arg)
224+
C.picoev_add(p.cloop, newfd, C.PICOEV_READ, timeout_secs, rw_callback, cb_arg)
225+
}
226+
}
227+
216228
pub fn external_fd_rw_callback(loop &C.picoev_loop, fd, events int, cb_arg voidptr) {
217229
if (events & C.PICOEV_READ) != 0 {
218230
pv.cb_ext_fd_cb(fd, cb_arg)
@@ -302,8 +314,18 @@ fn accept_callback_async(loop &C.picoev_loop, fd, events int, cb_arg voidptr) {
302314
}
303315
}
304316

317+
fn accept_callback_async_cloop(loop &C.picoev_loop, fd, events int, cb_arg voidptr) {
318+
newfd := C.accept(fd, 0, 0)
319+
if newfd != -1 {
320+
setup_sock(newfd)
321+
mut p := &Picoev(cb_arg)
322+
p.data[newfd] = p.open_cb(newfd)
323+
C.picoev_add(p.cloop, newfd, C.PICOEV_READ, timeout_secs, rw_callback_async, cb_arg)
324+
}
325+
}
326+
305327
__global pv Picoev
306-
pub fn (pv Picoev) listen(port int, is_async bool) {
328+
pub fn (pv Picoev) listen(port int) {
307329
fd := C.socket(C.AF_INET, C.SOCK_STREAM, 0)
308330
assert fd != -1
309331

@@ -331,74 +353,75 @@ pub fn (pv Picoev) listen(port int, is_async bool) {
331353

332354
setup_sock(fd)
333355

334-
if !is_async {
335-
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback, &pv)
356+
if !pv.is_async {
357+
if !pv.is_cloop {
358+
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback, &pv)
359+
} else {
360+
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback_cloop, &pv)
361+
}
336362
} else {
337-
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback_async, &pv)
363+
if !pv.is_cloop {
364+
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback_async, &pv)
365+
} else {
366+
C.picoev_add(pv.loop, fd, C.PICOEV_READ, 0, accept_callback_async_cloop, &pv)
367+
}
338368
}
339369
}
340-
pub fn new(port int, cb voidptr, open_cb voidptr, close_cb voidptr, cb_ext_fd_cb voidptr, is_async bool) &Picoev {
341-
/*fd := C.socket(C.AF_INET, C.SOCK_STREAM, 0)
342-
assert fd != -1
343-
344-
flag := 1
345-
assert C.setsockopt(fd, C.SOL_SOCKET, C.SO_REUSEADDR, &flag, sizeof(int)) == 0
346-
assert C.setsockopt(fd, C.SOL_SOCKET, C.SO_REUSEPORT, &flag, sizeof(int)) == 0
347-
$if linux {
348-
assert C.setsockopt(fd, C.IPPROTO_TCP, C.TCP_QUICKACK, &flag, sizeof(int)) == 0
349-
timeout := 10
350-
assert C.setsockopt(fd, C.IPPROTO_TCP, C.TCP_DEFER_ACCEPT, &timeout, sizeof(int)) == 0
351-
queue_len := 4096
352-
assert C.setsockopt(fd, C.IPPROTO_TCP, C.TCP_FASTOPEN, &queue_len, sizeof(int)) == 0
353-
}
354-
355-
mut addr := C.sockaddr_in{}
356-
addr.sin_family = C.AF_INET
357-
addr.sin_port = C.htons(port)
358-
addr.sin_addr.s_addr = C.htonl(C.INADDR_ANY)
359-
size := 16 // sizeof(C.sockaddr_in)
360-
bind_res := C.bind(fd, &addr, size)
361-
assert bind_res == 0
362-
363-
listen_res := C.listen(fd, C.SOMAXCONN)
364-
assert listen_res == 0
365-
366-
setup_sock(fd)*/
367-
370+
pub fn new(port int, cb voidptr, open_cb voidptr, close_cb voidptr, cb_ext_fd_cb voidptr, is_async bool, is_cloop bool) &Picoev {
368371
C.picoev_init(max_fds)
369372
loop := C.picoev_create_loop(max_timeout)
370373
if !is_async {
371374
mut pv := &Picoev{
372375
loop: loop
376+
cloop: 0
377+
is_async: is_async
378+
is_cloop: is_cloop
373379
cb: cb
374380
date: C.get_date()
375381
buf: malloc(max_fds * max_read + 1)
376382
out: malloc(max_fds * max_write + 1)
377383
}
378-
//C.picoev_add(loop, fd, C.PICOEV_READ, 0, accept_callback, pv)
384+
if is_cloop {
385+
pv.cloop = C.picoev_create_loop(max_timeout)
386+
}
379387
go update_date(mut pv)
380388
return pv
381389
} else {
382390
mut pv := &Picoev{
383391
loop: loop
392+
cloop: 0
384393
cb1: cb
394+
is_async: is_async
395+
is_cloop: is_cloop
385396
open_cb: open_cb
386397
close_cb: close_cb
387398
cb_ext_fd_cb: cb_ext_fd_cb
388399
buf: malloc(max_fds * max_read + 1)
389400
out: malloc(max_fds * max_write + 1)
390401
}
391-
//C.picoev_add(loop, fd, C.PICOEV_READ, 0, accept_callback_async, pv)
402+
if is_cloop {
403+
pv.cloop = C.picoev_create_loop(max_timeout)
404+
}
392405
return pv
393406
}
394407
}
395408

409+
pub fn (p Picoev) serve_c() {
410+
for {
411+
C.picoev_loop_once(p.cloop, 1)
412+
}
413+
}
414+
396415
pub fn (p Picoev) serve() {
416+
if p.is_cloop {
417+
go p.serve_c()
418+
}
397419
for {
398420
C.picoev_loop_once(p.loop, 1)
399421
}
400422
}
401423

424+
402425
fn update_date(mut p Picoev) {
403426
for {
404427
p.date = C.get_date()

0 commit comments

Comments
 (0)