main.odin ¶
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package main
17
18import "core:nbio"
19import "core:thread"
20import "core:time"
21
22Connection :: struct {
23 loop: ^nbio.Event_Loop,
24 socket: nbio.TCP_Socket,
25
26 bufs: [1][]byte,
27}
28
29main :: proc() {
30
31
32
33 workers: thread.Pool
34 thread.pool_init(&workers, context.allocator, 2)
35 thread.pool_start(&workers)
36
37 ep, ok := nbio.parse_endpoint("127.0.0.1:1234")
38 assert(ok)
39
40 err := nbio.acquire_thread_event_loop()
41 defer nbio.release_thread_event_loop()
42 assert(err == nil)
43
44 server, listen_err := nbio.listen_tcp(ep)
45 assert(listen_err == nil)
46 nbio.accept_poly(server, &workers, on_accept)
47
48 err = nbio.run()
49 assert(err == nil)
50
51 on_accept :: proc(op: ^nbio.Operation, workers: ^thread.Pool) {
52 assert(op.accept.err == nil)
53
54
55 nbio.accept_poly(op.accept.socket, workers, on_accept)
56
57
58 thread.pool_add_task(workers, context.allocator, do_work, new_clone(Connection{
59 loop = op.l,
60 socket = op.accept.client,
61 }))
62 }
63
64 do_work :: proc(t: thread.Task) {
65 connection := (^Connection)(t.data)
66
67
68 time.sleep(time.Second * 5)
69
70
71
72 connection.bufs = {transmute([]byte)string("Hellope!\n")}
73 nbio.send_poly(connection.socket, connection.bufs[:], connection, on_sent, l=connection.loop)
74 }
75
76 on_sent :: proc(op: ^nbio.Operation, connection: ^Connection) {
77 assert(op.send.err == nil)
78
79 nbio.close(connection.socket)
80 free(connection)
81 }
82}