// Package nbio/poly contains variants of the nbio procedures that use generic/poly data // so users can avoid casts and use multiple arguments. // // Please reference the documentation in `nbio`. // // Intention is to import this like so `import nbio "nbio/poly"` package poly import "core:mem" import "core:net" import "core:os" import "core:time" import nbio ".." // Because mem is only used inside the poly procs, the checker thinks we aren't using it. _ :: mem /// Re-export `nbio` stuff that is not wrapped in this package. Completion :: nbio.Completion IO :: nbio.IO init :: nbio.init tick :: nbio.tick num_waiting :: nbio.num_waiting destroy :: nbio.destroy open_socket :: nbio.open_socket open_and_listen_tcp :: nbio.open_and_listen_tcp listen :: nbio.listen Closable :: nbio.Closable open :: nbio.open Whence :: nbio.Whence seek :: nbio.seek Poll_Event :: nbio.Poll_Event poll_remove :: nbio.poll_remove /// Timeout timeout :: proc { timeout1, timeout2, timeout3, } timeout1 :: proc(io: ^nbio.IO, dur: time.Duration, p: $T, callback: $C/proc(p: T)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._timeout(io, dur, nil, proc(completion: rawptr) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } timeout2 :: proc(io: ^nbio.IO, dur: time.Duration, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._timeout(io, dur, nil, proc(completion: rawptr) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } timeout3 :: proc(io: ^nbio.IO, dur: time.Duration, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._timeout(io, dur, nil, proc(completion: rawptr) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Close close :: proc { close_no_cb, close1, close2, close3, } close_no_cb :: proc(io: ^nbio.IO, fd: nbio.Closable) { nbio.close(io, fd) } close1 :: proc(io: ^nbio.IO, fd: nbio.Closable, p: $T, callback: $C/proc(p: T, ok: bool)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._close(io, fd, nil, proc(completion: rawptr, ok: bool) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, ok) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } close2 :: proc(io: ^nbio.IO, fd: nbio.Closable, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, ok: bool)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._close(io, fd, nil, proc(completion: rawptr, ok: bool) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, ok) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } close3 :: proc(io: ^nbio.IO, fd: nbio.Closable, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, ok: bool)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._close(io, fd, nil, proc(completion: rawptr, ok: bool) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T3):]))^ cb(p, p2, p3, ok) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Accept accept :: proc { accept1, accept2, accept3, } accept1 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, p: $T, callback: $C/proc(p: T, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._accept(io, socket, nil, proc(completion: rawptr, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, client, source, err) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } accept2 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._accept(io, socket, nil, proc(completion: rawptr, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, client, source, err) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } accept3 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._accept(io, socket, nil, proc(completion: rawptr, client: net.TCP_Socket, source: net.Endpoint, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, client, source, err) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Connect connect :: proc { connect1, connect2, connect3, } connect1 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, p: $T, callback: $C/proc(p: T, socket: net.TCP_Socket, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion, err := nbio._connect(io, endpoint, nil, proc(completion: rawptr, socket: net.TCP_Socket, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, socket, err) }) if err != nil { callback(p, {}, err) return } callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } connect2 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, socket: net.TCP_Socket, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion, err := nbio._connect(io, endpoint, nil, proc(completion: rawptr, socket: net.TCP_Socket, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, socket, err) }) if err != nil { callback(p, p2, {}, err) return } callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } connect3 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, socket: net.TCP_Socket, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion, err := nbio._connect(io, endpoint, nil, proc(completion: rawptr, socket: net.TCP_Socket, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, socket, err) }) if err != nil { callback(p, p2, p3, {}, err) return } callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Internal Recv _recv :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, all: bool, p: $T, callback: $C/proc(p: T, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._recv(io, socket, buf, nil, proc(completion: rawptr, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, received, udp_client, err) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } _recv2 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, all: bool, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._recv(io, socket, buf, nil, proc(completion: rawptr, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, received, udp_client, err) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } _recv3 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, all: bool, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._recv(io, socket, buf, nil, proc(completion: rawptr, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, received, udp_client, err) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Recv recv :: proc { recv1, recv2, recv3, } recv1 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _recv(io, socket, buf, false, p, callback) } recv2 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _recv2(io, socket, buf, false, p, p2, callback) } recv3 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _recv3(io, socket, buf, false, p, p2, p3, callback) } /// Recv All recv_all :: proc { recv_all1, recv_all2, recv_all3, } recv_all1 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _recv(io, socket, buf, true, p, callback) } recv_all2 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _recv_all2(io, socket, buf, false, p, p2, callback) } recv_all3 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, received: int, udp_client: Maybe(net.Endpoint), err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _recv_all2(io, socket, buf, false, p, p2, p3, callback) } /// Send send :: proc { send_tcp1, send_tcp2, send_tcp3, send_udp1, send_udp2, send_udp3, } /// Send Internal _send :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, sent: int, err: net.Network_Error), endpoint: Maybe(net.Endpoint) = nil, all := false) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._send(io, socket, buf, nil, proc(completion: rawptr, sent: int, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, sent, err) }, endpoint, all) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } _send2 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, sent: int, err: net.Network_Error), endpoint: Maybe(net.Endpoint) = nil, all := false) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._send(io, socket, buf, nil, proc(completion: rawptr, sent: int, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, sent, err) }, endpoint, all) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } _send3 :: proc(io: ^nbio.IO, socket: net.Any_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, sent: int, err: net.Network_Error), endpoint: Maybe(net.Endpoint) = nil, all := false) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._send(io, socket, buf, nil, proc(completion: rawptr, sent: int, err: net.Network_Error) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, sent, err) }, endpoint, all) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Send TCP send_tcp1 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, sent: int, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _send(io, socket, buf, p, callback) } send_tcp2 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _send2(io, socket, buf, p, p2, callback) } send_tcp3 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _send3(io, socket, buf, p, p2, p3, callback) } /// Send UDP send_udp1 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, sent: int, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _send(io, socket, buf, p, callback, endpoint) } send_udp2 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _send2(io, socket, buf, p, p2, callback, endpoint) } send_udp3 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _send3(io, socket, buf, p, p2, p3, callback, endpoint) } /// Send All send_all :: proc { send_all_tcp1, send_all_tcp2, send_all_tcp3, send_all_udp1, send_all_udp2, send_all_udp3, } /// Send All TCP send_all_tcp1 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, sent: int, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _send(io, socket, buf, p, callback, all = true) } send_all_tcp2 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _send2(io, socket, buf, p, p2, callback, all = true) } send_all_tcp3 :: proc(io: ^nbio.IO, socket: net.TCP_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _send3(io, socket, buf, p, p2, p3, callback, all = true) } /// Send All UDP send_all_udp1 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, callback: $C/proc(p: T, sent: int, err: net.Network_Error)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _send(io, socket, buf, p, callback, endpoint, all = true) } send_all_udp2 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _send2(io, socket, buf, p, p2, callback, endpoint, all = true) } send_all_udp3 :: proc(io: ^nbio.IO, endpoint: net.Endpoint, socket: net.UDP_Socket, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, sent: int, err: net.Network_Error)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _send3(io, socket, buf, p, p2, p3, callback, endpoint, all = true) } /// Read Internal _read :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, callback: $C/proc(p: T, read: int, err: os.Errno), all := false) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._read(io, fd, offset, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, read, err) }, all) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } _read2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, read: int, err: os.Errno), all := false) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._read(io, fd, offset, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, read, err) }, all) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } _read3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, read: int, err: os.Errno), all := false) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._read(io, fd, offset, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, read, err) }, all) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Read read :: proc { read1, read2, read3, } read1 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, callback: $C/proc(p: T, read: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _read(io, fd, nil, buf, p, callback) } read2 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, read: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _read2(io, fd, nil, buf, p, p2, callback) } read3 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, read: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _read3(io, fd, nil, buf, p, p2, p3, callback) } /// Read All read_all :: proc { read_all1, read_all2, read_all3, } read_all1 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, callback: $C/proc(p: T, read: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _read(io, fd, nil, buf, p, callback, all = true) } read_all2 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, read: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _read2(io, fd, nil, buf, p, p2, callback, all = true) } read_all3 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, read: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _read3(io, fd, nil, buf, p, p2, p3, callback, all = true) } /// Read At read_at :: proc { read_at1, read_at2, read_at3, } read_at1 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, callback: $C/proc(p: T, read: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _read(io, fd, offset, buf, p, callback) } read_at2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, read: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _read2(io, fd, offset, buf, p, p2, callback) } read_at3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, read: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _read3(io, fd, offset, buf, p, p2, p3, callback) } /// Read At All read_at_all :: proc { read_at_all1, read_at_all2, read_at_all3, } read_at_all1 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, callback: $C/proc(p: T, read: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _read(io, fd, offset, buf, p, callback, all = true) } read_at_all2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, read: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _read2(io, fd, offset, buf, p, p2, callback, all = true) } read_at_all3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, read: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _read3(io, fd, offset, buf, p, p2, p3, callback, all = true) } /// Read Full / Entire File read_entire_file :: read_full read_full :: proc { read_full1, read_full2, read_full3, } read_full1 :: proc(io: ^nbio.IO, fd: os.Handle, p: $T, callback: $C/proc(p: T, buf: []byte, read: int, err: os.Errno), allocator := context.allocator) where size_of(T) + size_of([]byte) <= nbio.MAX_USER_ARGUMENTS { size, err := seek(io, fd, 0, .End) if err != os.ERROR_NONE { callback(p, nil, 0, err) return } if size <= 0 { callback(p, nil, 0, os.ERROR_NONE) return } buf := make([]byte, size, allocator) completion := nbio._read(io, fd, 0, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ buf := (^[]byte)(raw_data(completion.user_args[size_of(C):]))^ p := (^T) (raw_data(completion.user_args[size_of(C) + size_of([]byte):]))^ cb(p, buf, read, err) }, all = true) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&buf)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } read_full2 :: proc(io: ^nbio.IO, fd: os.Handle, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, buf: []byte, read: int, err: os.Errno), allocator := context.allocator) where size_of(T) + size_of(T2) + size_of([]byte) <= nbio.MAX_USER_ARGUMENTS { size, err := seek(io, fd, 0, .End) if err != os.ERROR_NONE { callback(p, p2, nil, 0, err) return } if size <= 0 { callback(p, p2, nil, 0, os.ERROR_NONE) return } buf := make([]byte, size, allocator) completion := nbio._read(io, fd, 0, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ buf := (^[]byte)(raw_data(completion.user_args[size_of(C):]))^ p := (^T) (raw_data(completion.user_args[size_of(C) + size_of([]byte):]))^ p2 := (^T2) (raw_data(completion.user_args[size_of(C) + size_of([]byte) + size_of(T):]))^ cb(p, p2, buf, read, err) }, all = true) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&buf)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } read_full3 :: proc(io: ^nbio.IO, fd: os.Handle, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, buf: []byte, read: int, err: os.Errno), allocator := context.allocator) where size_of(T) + size_of(T2) + size_of(T3) + size_of([]byte) <= nbio.MAX_USER_ARGUMENTS { size, err := seek(io, fd, 0, .End) if err != os.ERROR_NONE { callback(p, p2, p3, nil, 0, err) return } if size <= 0 { callback(p, p2, p3, nil, 0, os.ERROR_NONE) return } buf := make([]byte, size, allocator) completion := nbio._read(io, fd, 0, buf, nil, proc(completion: rawptr, read: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ buf := (^[]byte)(raw_data(completion.user_args[size_of(C):]))^ p := (^T) (raw_data(completion.user_args[size_of(C) + size_of([]byte):]))^ p2 := (^T2) (raw_data(completion.user_args[size_of(C) + size_of([]byte) + size_of(T):]))^ p3 := (^T3) (raw_data(completion.user_args[size_of(C) + size_of([]byte) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, buf, read, err) }, all = true) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&buf)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Write Internal _write :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, callback: $C/proc(p: T, written: int, err: os.Errno), all := false) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._write(io, fd, offset, buf, nil, proc(completion: rawptr, written: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, written, err) }, all) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } _write2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, written: int, err: os.Errno), all := false) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._write(io, fd, offset, buf, nil, proc(completion: rawptr, written: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, written, err) }, all) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } _write3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: Maybe(int), buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, written: int, err: os.Errno), all := false) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._write(io, fd, offset, buf, nil, proc(completion: rawptr, written: int, err: os.Errno) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, written, err) }, all) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } /// Write write :: proc { write1, write2, write3, } write1 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, callback: $C/proc(p: T, written: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _write(io, fd, nil, buf, p, callback) } write2 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, written: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _write2(io, fd, nil, buf, p, p2, callback) } write3 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, written: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _write3(io, fd, nil, buf, p, p2, p3, callback) } /// Write All write_all :: proc { write_all1, write_all2, write_all3, } write_all1 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, callback: $C/proc(p: T, written: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _write(io, fd, nil, buf, p, callback, all = true) } write_all2 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, written: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _write2(io, fd, nil, buf, p, p2, callback, all = true) } write_all3 :: proc(io: ^nbio.IO, fd: os.Handle, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, written: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _write3(io, fd, nil, buf, p, p2, p3, callback, all = true) } /// Write At write_at :: proc { write_at1, write_at2, write_at3, } write_at1 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, callback: $C/proc(p: T, written: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _write(io, fd, offset, buf, p, callback) } write_at2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, written: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _write2(io, fd, offset, buf, p, p2, callback) } write_at3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, written: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _write3(io, fd, offset, buf, p, p2, p3, callback) } /// Write At All write_at_all :: proc { write_at_all1, write_at_all2, write_at_all3, } write_at_all1 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, callback: $C/proc(p: T, written: int, err: os.Errno)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { _write(io, fd, offset, buf, p, callback, all = true) } write_at_all2 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, written: int, err: os.Errno)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { _write2(io, fd, offset, buf, p, p2, callback, all = true) } write_at_all3 :: proc(io: ^nbio.IO, fd: os.Handle, offset: int, buf: []byte, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, written: int, err: os.Errno)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { _write3(io, fd, offset, buf, p, p2, p3, callback, all = true) } next_tick1 :: proc(io: ^IO, p: $T, callback: $C/proc(p: T)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._next_tick(io, nil, proc(completion: rawptr) { completion := (^Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } next_tick2 :: proc(io: ^nbio.IO, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._next_tick(io, nil, proc(completion: rawptr) { completion := (^nbio.Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } next_tick3 :: proc(io: ^IO, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._next_tick(io, nil, proc(completion: rawptr) { completion := (^Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } next_tick :: proc { next_tick1, next_tick2, next_tick3, } poll1 :: proc(io: ^IO, fd: os.Handle, event: Poll_Event, multi: bool, p: $T, callback: $C/proc(p: T, event: Poll_Event)) where size_of(T) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._poll(io, fd, event, multi, nil, proc(completion: rawptr, event: Poll_Event) { completion := (^Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ cb(p, event) }) callback, p := callback, p n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) completion.user_data = completion } poll2 :: proc(io: ^IO, fd: os.Handle, event: Poll_Event, multi: bool, p: $T, p2: $T2, callback: $C/proc(p: T, p2: T2, event: Poll_Event)) where size_of(T) + size_of(T2) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._poll(io, fd, event, multi, nil, proc(completion: rawptr, event: Poll_Event) { completion := (^Completion)(completion) cb := (^C)(&completion.user_args[0])^ p := (^T)(raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ cb(p, p2, event) }) callback, p, p2 := callback, p, p2 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) completion.user_data = completion } poll3 :: proc(io: ^IO, fd: os.Handle, event: Poll_Event, multi: bool, p: $T, p2: $T2, p3: $T3, callback: $C/proc(p: T, p2: T2, p3: T3, event: Poll_Event)) where size_of(T) + size_of(T2) + size_of(T3) <= nbio.MAX_USER_ARGUMENTS { completion := nbio._poll(io, fd, event, multi, nil, proc(completion: rawptr, event: Poll_Event) { completion := (^Completion)(completion) cb := (^C) (&completion.user_args[0])^ p := (^T) (raw_data(completion.user_args[size_of(C):]))^ p2 := (^T2)(raw_data(completion.user_args[size_of(C) + size_of(T):]))^ p3 := (^T3)(raw_data(completion.user_args[size_of(C) + size_of(T) + size_of(T2):]))^ cb(p, p2, p3, event) }) callback, p, p2, p3 := callback, p, p2, p3 n := copy(completion.user_args[:], mem.ptr_to_bytes(&callback)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p)) n += copy(completion.user_args[n:], mem.ptr_to_bytes(&p2)) _ = copy(completion.user_args[n:], mem.ptr_to_bytes(&p3)) completion.user_data = completion } poll :: proc { poll1, poll2, poll3, }