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
27main :: proc() {
28
29
30
31 workers: thread.Pool
32 thread.pool_init(&workers, context.allocator, 2)
33 thread.pool_start(&workers)
34
35 ep, ok := nbio.parse_endpoint("127.0.0.1:1234")
36 assert(ok)
37
38 err := nbio.acquire_thread_event_loop()
39 defer nbio.release_thread_event_loop()
40 assert(err == nil)
41
42 server, listen_err := nbio.listen_tcp(ep)
43 assert(listen_err == nil)
44 nbio.accept_poly(server, &workers, on_accept)
45
46 err = nbio.run()
47 assert(err == nil)
48
49 on_accept :: proc(op: ^nbio.Operation, workers: ^thread.Pool) {
50 assert(op.accept.err == nil)
51
52
53 nbio.accept_poly(op.accept.socket, workers, on_accept)
54
55
56 thread.pool_add_task(workers, context.allocator, do_work, new_clone(Connection{
57 loop = op.l,
58 socket = op.accept.client,
59 }))
60 }
61
62 do_work :: proc(t: thread.Task) {
63 connection := (^Connection)(t.data)
64
65
66 time.sleep(time.Second * 5)
67
68
69
70 nbio.send_poly(connection.socket, {transmute([]byte)string("Hellope!\n")}, connection, on_sent, l=connection.loop)
71 }
72
73 on_sent :: proc(op: ^nbio.Operation, connection: ^Connection) {
74 assert(op.send.err == nil)
75
76 nbio.close(connection.socket)
77 free(connection)
78 }
79}