Lindenii Project Forge
Login

hare-aio

Asynchronous I/O event loops for Hare

Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.

/cmd/read_file/main.ha (raw)

use aio;
use fmt;
use io;
use os;

let buf32: [32]u8 = [0...];

let buf: []u8 = buf32[..];

let ofs: size = 0;

export fn main() void = {
	let loop = aio::loop_new()!;

	let file = os::open("main.ha")!;

	aio::op_read(&loop, file, buf, ofs, &on_read, null, aio::submission_flags::NONE)!;
	aio::loop_submit(&loop)!;

	aio::loop_run(&loop);

	// loop_finish(&loop);
};

fn on_read(
	loop: *aio::loop,
	file: io::file,
	r: (size | io::EOF | io::error),
	flags: aio::completion_flags,
	user: nullable *opaque,
) void = {
	match (r) {
	case io::EOF => abort("EOF");
	case io::error => abort(io::strerror(r as io::error));
	case size => void;
	};

	io::write(os::stdout, buf[.. r as size])!;
	ofs += r as size;
	aio::op_read(loop, file, buf, ofs, &on_read, null, aio::submission_flags::NONE)!; // TODO: use multishot instead? or does that not work for files
	aio::loop_submit(loop)!;
};