Skip to content

Commit d53128f

Browse files
committed
utilize new defer syntax
1 parent 3a917c5 commit d53128f

File tree

12 files changed

+161
-244
lines changed

12 files changed

+161
-244
lines changed

src/example/tcp_echo_server/main.mbt

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,20 @@
1616
fn main_prog() -> Unit raise {
1717
@async.with_event_loop(fn(root) {
1818
let listen_sock = @socket.TCP::new()
19-
try {
20-
listen_sock..bind(@socket.Addr::parse("0.0.0.0:4200"))..listen()
21-
for {
22-
let (conn, addr) = listen_sock.accept()
23-
println("received new connection from \{addr}")
24-
root.spawn_bg(fn() {
25-
let buf = FixedArray::make(1024, b'0')
26-
while conn.recv(buf) is n && n > 0 {
27-
let buf = buf.unsafe_reinterpret_as_bytes()
28-
conn.send(buf[0:n].to_bytes())
29-
}
30-
println("connection closed")
31-
})
32-
}
33-
} catch {
34-
err => {
35-
listen_sock.close()
36-
raise err
37-
}
19+
defer listen_sock.close()
20+
listen_sock..bind(@socket.Addr::parse("0.0.0.0:4200"))..listen()
21+
for {
22+
let (conn, addr) = listen_sock.accept()
23+
println("received new connection from \{addr}")
24+
root.spawn_bg(fn() {
25+
defer conn.close()
26+
let buf = FixedArray::make(1024, b'0')
27+
while conn.recv(buf) is n && n > 0 {
28+
let buf = buf.unsafe_reinterpret_as_bytes()
29+
conn.send(buf[0:n].to_bytes())
30+
}
31+
println("connection closed")
32+
})
3833
}
3934
})
4035
}

src/example/tcp_ping_pong/main.mbt

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,33 @@ pub(all) type Printer (String) -> Unit
2525
async fn server(println : Printer) -> Unit raise {
2626
@async.with_task_group(fn(group) {
2727
let listen_sock = @socket.TCP::new()
28+
defer listen_sock.close()
2829
listen_sock..bind(@socket.Addr::parse("0.0.0.0:\{port}"))..listen()
2930
try {
3031
for {
3132
let (conn, _) = listen_sock.accept()
3233
println("received new connection")
3334
group.spawn_bg(fn() {
35+
defer conn.close()
3436
let buf = FixedArray::make(1024, b'0')
35-
try {
36-
while conn.recv(buf) is n && n > 0 {
37-
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
38-
println("server received: \{msg}")
39-
let reply = b"pong"
40-
conn.send(reply)
41-
println("server sent: \{reply}")
42-
if msg == b"exit" {
43-
println("server initiate terminate")
44-
raise ServerTerminate
45-
}
46-
} else {
47-
println("server: connection closed by peer")
48-
}
49-
conn.close()
50-
} catch {
51-
err => {
52-
conn.close()
53-
raise err
37+
while conn.recv(buf) is n && n > 0 {
38+
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
39+
println("server received: \{msg}")
40+
let reply = b"pong"
41+
conn.send(reply)
42+
println("server sent: \{reply}")
43+
if msg == b"exit" {
44+
println("server initiate terminate")
45+
raise ServerTerminate
5446
}
47+
} else {
48+
println("server: connection closed by peer")
5549
}
5650
})
5751
}
5852
} catch {
5953
err => {
6054
println("server terminate: \{err}")
61-
listen_sock.close()
6255
raise err
6356
}
6457
}
@@ -68,6 +61,7 @@ async fn server(println : Printer) -> Unit raise {
6861
///|
6962
async fn client(println : Printer, id : Int, msg : Bytes) -> Unit raise {
7063
let conn = @socket.TCP::new()
64+
defer conn.close()
7165
conn.connect(@socket.Addr::parse("127.0.0.1:\{port}"))
7266
// The sleep here is used to make test result stable and portable,
7367
// because this message is in race condition
@@ -77,20 +71,11 @@ async fn client(println : Printer, id : Int, msg : Bytes) -> Unit raise {
7771
conn.send(msg)
7872
println("client \{id} sent: \{msg}")
7973
let buf = FixedArray::make(1024, b'0')
80-
try {
81-
if conn.recv(buf) is n && n > 0 {
82-
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
83-
println("client \{id} received: \{msg}")
84-
} else {
85-
println("client \{id}: connection closed by peer")
86-
}
87-
} catch {
88-
err => {
89-
conn.close()
90-
raise err
91-
}
92-
} noraise {
93-
_ => conn.close()
74+
if conn.recv(buf) is n && n > 0 {
75+
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
76+
println("client \{id} received: \{msg}")
77+
} else {
78+
println("client \{id}: connection closed by peer")
9479
}
9580
}
9681

src/example/udp_echo_server/main.mbt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414

1515
///|
1616
fn main_prog() -> Unit raise {
17-
let server = @socket.UDP::new()
1817
@async.with_event_loop(fn(root) {
18+
let server = @socket.UDP::new()
19+
defer server.close()
1920
server.bind(@socket.Addr::parse("0.0.0.0:4200"))
2021
for {
2122
let buf = FixedArray::make(1024, b'0')
@@ -25,12 +26,7 @@ fn main_prog() -> Unit raise {
2526
server.sendto(buf[0:n].to_bytes(), addr)
2627
})
2728
}
28-
}) catch {
29-
err => {
30-
server.close()
31-
raise err
32-
}
33-
}
29+
})
3430
}
3531

3632
///|

src/example/udp_ping_pong/main.mbt

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ pub(all) type Printer (String) -> Unit
2323

2424
///|
2525
async fn server(println : Printer) -> Unit raise {
26-
let server_sock = @socket.UDP::new()
2726
@async.with_task_group(fn(group) {
27+
let server_sock = @socket.UDP::new()
28+
defer server_sock.close()
2829
server_sock.bind(@socket.Addr::parse("0.0.0.0:\{port}"))
2930
let buf = FixedArray::make(1024, b'0')
3031
while server_sock.recvfrom(buf) is (n, addr) && n > 0 {
@@ -45,7 +46,6 @@ async fn server(println : Printer) -> Unit raise {
4546
}) catch {
4647
err => {
4748
println("server terminate: \{err}")
48-
server_sock.close()
4949
raise err
5050
}
5151
}
@@ -54,25 +54,17 @@ async fn server(println : Printer) -> Unit raise {
5454
///|
5555
async fn client(println : Printer, id : Int, msg : Bytes) -> Unit raise {
5656
let conn = @socket.UDP::new()
57+
defer conn.close()
5758
conn.connect(@socket.Addr::parse("127.0.0.1:\{port}"))
5859
conn.send(msg)
5960
println("client \{id} sent: \{msg}")
6061
let buf = FixedArray::make(1024, b'0')
61-
try {
62-
if conn.recv(buf) is n && n > 0 {
63-
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
64-
println("client \{id} received: \{msg}")
65-
conn.close()
66-
} else {
67-
println("client \{id}: connection closed by peer")
68-
}
69-
} catch {
70-
err => {
71-
conn.close()
72-
raise err
73-
}
74-
} noraise {
75-
_ => conn.close()
62+
if conn.recv(buf) is n && n > 0 {
63+
let msg = buf.unsafe_reinterpret_as_bytes()[0:n]
64+
println("client \{id} received: \{msg}")
65+
conn.close()
66+
} else {
67+
println("client \{id}: connection closed by peer")
7668
}
7769
}
7870

src/fs/create_test.mbt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ test "basic create" {
1717
let buf = FixedArray::make(4, b'0')
1818
@async.with_event_loop(fn(_) {
1919
let path = b"basic_create_test\x00"
20-
let w = @fs.create(path, permission=0o644, sync=Full)
21-
w.write(b"abcd\n")
22-
w.close()
23-
let r = @fs.open(path, mode=ReadOnly)
24-
guard r.read(buf) == buf.length()
25-
r.close()
20+
{
21+
let w = @fs.create(path, permission=0o644, sync=Full)
22+
defer w.close()
23+
w.write(b"abcd\n")
24+
}
25+
{
26+
let r = @fs.open(path, mode=ReadOnly)
27+
defer r.close()
28+
guard r.read(buf) == buf.length()
29+
}
2630
@fs.remove(path)
2731
})
2832
inspect(buf, content="[b'\\x61', b'\\x62', b'\\x63', b'\\x64']")

src/fs/eof_test.mbt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ test "read EOF" {
1717
let buf = FixedArray::make(16, b'0')
1818
@async.with_event_loop(fn(_) {
1919
let path = b"read_eof_test\x00"
20-
let w = @fs.create(path, permission=0o644, sync=Full)
21-
w.write(b"abcd")
22-
w.close()
23-
let r = @fs.open(path, mode=ReadOnly)
24-
let n = r.read(buf)
25-
r.close()
20+
{
21+
let w = @fs.create(path, permission=0o644, sync=Full)
22+
defer w.close()
23+
w.write(b"abcd")
24+
}
25+
let n = {
26+
let r = @fs.open(path, mode=ReadOnly)
27+
defer r.close()
28+
r.read(buf)
29+
}
2630
@fs.remove(path)
2731
assert_eq(n, 4)
2832
inspect(

src/fs/seek_test.mbt

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,42 @@ test "basic seek" {
1919
@async.with_event_loop(fn(_) {
2020
let path = b"basic_seek_test\x00"
2121
// initialize
22-
let w = @fs.create(path, permission=0o644, sync=Full)
23-
log.write_string("initial size: \{w.size()}\n")
24-
w.write(b"abcdef")
25-
log.write_string("size after write: \{w.size()}\n")
26-
w.close()
22+
{
23+
let w = @fs.create(path, permission=0o644, sync=Full)
24+
defer w.close()
25+
log.write_string("initial size: \{w.size()}\n")
26+
w.write(b"abcdef")
27+
log.write_string("size after write: \{w.size()}\n")
28+
}
2729
// first read
28-
let r = @fs.open(path, mode=ReadOnly)
29-
log.write_string("current size: \{r.size()}\n")
30-
guard r.read(buf) == buf.length()
31-
log.write_string("current content: \{buf}\n")
32-
r.close()
30+
{
31+
let r = @fs.open(path, mode=ReadOnly)
32+
defer r.close()
33+
log.write_string("current size: \{r.size()}\n")
34+
guard r.read(buf) == buf.length()
35+
log.write_string("current content: \{buf}\n")
36+
}
3337
// update content
34-
let w = @fs.open(path, mode=WriteOnly)
35-
ignore(w.seek(-2, mode=FromEnd))
36-
log.write_string("writing at position \{w.curr_pos()}\n")
37-
w.write(b"56")
38-
ignore(w.seek(2, mode=FromStart))
39-
log.write_string("writing at position \{w.curr_pos()}\n")
40-
w.write(b"34")
41-
ignore(w.seek(-4, mode=Relative))
42-
log.write_string("writing at position \{w.curr_pos()}\n")
43-
w.write(b"12")
44-
w.close()
38+
{
39+
let w = @fs.open(path, mode=WriteOnly)
40+
defer w.close()
41+
ignore(w.seek(-2, mode=FromEnd))
42+
log.write_string("writing at position \{w.curr_pos()}\n")
43+
w.write(b"56")
44+
ignore(w.seek(2, mode=FromStart))
45+
log.write_string("writing at position \{w.curr_pos()}\n")
46+
w.write(b"34")
47+
ignore(w.seek(-4, mode=Relative))
48+
log.write_string("writing at position \{w.curr_pos()}\n")
49+
w.write(b"12")
50+
}
4551
// read content
46-
let r = @fs.open(path, mode=ReadOnly)
47-
guard r.read(buf) == buf.length()
48-
log.write_string("final content: \{buf}\n")
49-
r.close()
52+
{
53+
let r = @fs.open(path, mode=ReadOnly)
54+
defer r.close()
55+
guard r.read(buf) == buf.length()
56+
log.write_string("final content: \{buf}\n")
57+
}
5058
@fs.remove(path)
5159
})
5260
inspect(

src/internal/coroutine/coroutine.mbt

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,12 @@ pub async fn pause() -> Unit raise {
7777
///|
7878
pub async fn suspend() -> Unit raise {
7979
guard scheduler.curr_coro is Some(coro)
80+
defer {
81+
scheduler.blocking -= 1
82+
}
8083
async_suspend(fn(ok_cont, err_cont) {
8184
guard coro.state is Running
82-
fn wrapped_ok_cont(x) {
83-
scheduler.blocking -= 1
84-
ok_cont(x)
85-
}
86-
87-
fn wrapped_err_cont(err) {
88-
scheduler.blocking -= 1
89-
err_cont(err)
90-
}
91-
92-
coro.state = Suspend(ok_cont=wrapped_ok_cont, err_cont=wrapped_err_cont)
85+
coro.state = Suspend(ok_cont~, err_cont~)
9386
scheduler.blocking += 1
9487
})
9588
}
@@ -179,18 +172,12 @@ pub async fn protect_from_cancel(f : async () -> Unit raise) -> Unit raise {
179172
f()
180173
} else {
181174
coro.shielded = true
182-
try f() catch {
183-
err => {
184-
coro.shielded = false
185-
raise err
186-
}
187-
} noraise {
188-
_ => {
189-
coro.shielded = false
190-
if coro.cancelled {
191-
raise Cancelled
192-
}
193-
}
175+
defer {
176+
coro.shielded = false
177+
}
178+
f()
179+
if coro.cancelled {
180+
raise Cancelled
194181
}
195182
}
196183
}

src/internal/event_loop/event_loop.mbt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,27 @@ let curr_loop : Ref[EventLoop?] = @ref.new(None)
4040
pub fn with_event_loop(f : async () -> Unit raise) -> Unit raise {
4141
guard curr_loop.val is None
4242
let job_completion_pipe = @thread_pool.init_thread_pool()
43+
defer @thread_pool.destroy_thread_pool()
4344
let evloop = {
4445
poll: Instance::new(),
4546
tasks: {},
4647
jobs: {},
4748
job_completion_pipe,
4849
}
50+
defer evloop.poll.destroy()
4951
evloop.poll.register(
5052
job_completion_pipe,
5153
prev_events=NoEvent,
5254
new_events=Read,
5355
)
56+
defer (evloop.poll.remove(job_completion_pipe, events=Read) catch { _ => () })
5457
curr_loop.val = Some(evloop)
58+
defer {
59+
curr_loop.val = None
60+
}
5561
let main = @coroutine.spawn(f)
5662
@coroutine.reschedule()
5763
evloop.run_forever()
58-
curr_loop.val = None
59-
evloop.poll.remove(job_completion_pipe, events=Read)
60-
evloop.poll.destroy()
61-
@thread_pool.destroy_thread_pool()
6264
main.unwrap()
6365
}
6466

0 commit comments

Comments
 (0)