From 73672a7a8483ead358b7fbaf357e3c6aae4bff12 Mon Sep 17 00:00:00 2001 From: Armin Preiml Date: Thu, 23 Jan 2025 15:54:28 +0100 Subject: [PATCH] ev: handle nomem Signed-off-by: Armin Preiml --- ev/+linux/file.ha | 4 ++-- ev/+linux/loop.ha | 10 +++++----- ev/+linux/signal.ha | 4 ++-- ev/+linux/socket.ha | 12 ++++++------ ev/+linux/timers.ha | 2 +- diff --git a/ev/+linux/file.ha b/ev/+linux/file.ha index b412408490d25c806f7a54d36cf5a3a99fc33155..084452c06f8099ed038952d42c4063a9ded92636 100644 --- a/ev/+linux/file.ha +++ b/ev/+linux/file.ha @@ -64,7 +64,7 @@ export fn register( loop: *loop, fd: io::file, user: nullable *opaque = null, -) (*file | errors::error) = { +) (*file | errors::error | nomem) = { const file = alloc(file { flags = fflags::NONE, fd = fd, @@ -72,7 +72,7 @@ ev = loop, op = op::NONE, user = user, ... - }); + })?; let ev = rt::epoll_event { events = 0, diff --git a/ev/+linux/loop.ha b/ev/+linux/loop.ha index d58fd96dc1c706f3c1964b94098db02d69c2888e..4127ac84b222350aa69d483ca964cc0b299f5b23 100644 --- a/ev/+linux/loop.ha +++ b/ev/+linux/loop.ha @@ -27,7 +27,7 @@ // to free associated resources when done using the loop. // // The optional "events" parameter controls how many events may be pending at // once. Most applications should not need to configure this parameter. -export fn newloop(events: size = 256) (loop | errors::error) = { +export fn newloop(events: size = 256) (loop | nomem | errors::error) = { const fd = match (rt::epoll_create1(rt::EPOLL_CLOEXEC)) { case let fd: int => yield fd: io::file; @@ -42,7 +42,7 @@ events = 0, data = rt::epoll_data { fd = 0, } - }...], events), + }...], events)?, dispatch = [], stop = false, }; @@ -74,13 +74,13 @@ export fn do( loop: *loop, cb: *dispatchcb, user: nullable *opaque = null, -) req = { +) (req | nomem) = { const dispatch = alloc(ondispatch { cb = cb, user = user, loop = loop, - }); - append(loop.dispatch, dispatch); + })?; + append(loop.dispatch, dispatch)?; return mkreq(&do_cancel, dispatch); }; diff --git a/ev/+linux/signal.ha b/ev/+linux/signal.ha index ddfd07dd5cea4dc794dccf70953e302c0bb01895..1aee689874c29fef3aba99cded58a6c186cf2f38 100644 --- a/ev/+linux/signal.ha +++ b/ev/+linux/signal.ha @@ -17,7 +17,7 @@ export fn signal( loop: *loop, cb: *signalcb, signals: signal::sig... -) (*file | errors::error) = { +) (*file | errors::error | nomem) = { const fd = signal::signalfd(signals...)?; const file = register(loop, fd)?; file.op = op::SIGNAL; @@ -36,7 +36,7 @@ let signals = buf[..0]; for (let i = 1; i < rt::NSIG; i += 1) { const sig = i: signal::sig; if (signal::sigset_member(&file.sigmask, sig)) { - static append(signals, sig); + static append(signals, sig)!; }; }; signal::unblock(signals...); diff --git a/ev/+linux/socket.ha b/ev/+linux/socket.ha index 6df05ef98686796f842355e4bbec93fd576e4b42..a860b97400c59e99c6b20e14c3c7b74aeaebfbb8 100644 --- a/ev/+linux/socket.ha +++ b/ev/+linux/socket.ha @@ -13,7 +13,7 @@ loop: *loop, addr: ip::addr, port: u16, opts: tcp::listen_option... -) (*file | net::error | errors::error) = { +) (*file | net::error | errors::error | nomem) = { const sock = tcp::listen(addr, port, opts...)?; return register(loop, sock)?; }; @@ -25,7 +25,7 @@ loop: *loop, addr: ip::addr, port: u16, opts: udp::listen_option... -) (*file | net::error | errors::error) = { +) (*file | net::error | errors::error | nomem) = { const sock = udp::listen(addr, port, opts...)?; return register(loop, sock)?; }; @@ -35,7 +35,7 @@ export fn listen_unix( loop: *loop, addr: unix::addr, opts: unix::listen_option... -) (*file | net::error | errors::error) = { +) (*file | net::error | errors::error | nomem) = { const sock = unix::listen(addr, opts...)?; return register(loop, sock)?; }; @@ -47,7 +47,7 @@ loop: *loop, dest: ip::addr, port: u16, opts: udp::connect_option... -) (*file | net::error | errors::error) = { +) (*file | net::error | errors::error | nomem) = { const sock = udp::connect(dest, port, opts...)?; const file = register(loop, sock)?; return file; @@ -81,7 +81,7 @@ cb: *connectcb, addr: ip::addr, port: u16, opts: (net::sockflag | *opaque)... -) (req | net::error | errors::error) = { +) (req | net::error | errors::error | nomem) = { // XXX: This doesn't let us set keepalive let opt: net::sockflag = 0; let user: nullable *opaque = null; @@ -128,7 +128,7 @@ loop: *loop, cb: *connectcb, addr: unix::addr, opts: (net::sockflag | *opaque)... -) (req | net::error | errors::error) = { +) (req | net::error | errors::error | nomem) = { let opt: net::sockflag = 0; let user: nullable *opaque = null; for (let i = 0z; i < len(opts); i += 1) { diff --git a/ev/+linux/timers.ha b/ev/+linux/timers.ha index 6cfa265218680dd564507dd1dc9052200eb8c34b..2d400ce6133f004eda6e5170f0b4ade1a2aa8376 100644 --- a/ev/+linux/timers.ha +++ b/ev/+linux/timers.ha @@ -12,7 +12,7 @@ export fn newtimer( loop: *loop, cb: *timercb, clock: time::clock, -) (*file | errors::error) = { +) (*file | errors::error | nomem) = { const fd = match (rt::timerfd_create(clock, rt::TFD_NONBLOCK | rt::TFD_CLOEXEC)) { case let fd: int => -- 2.48.1