Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.
/aio/op_read.ha (raw)
use io;
use linux::io_uring;
// The callback type for [[op_read]].
export type op_read_cb = fn(loop: *loop, file: io::file, r: (size | io::EOF | io::error), flags: completion_flags, user: nullable *opaque) void;
// An I/O request context for [[op_read]].
type op_read_ctx = struct {
	callback: *op_read_cb,
	user: nullable *opaque,
	file: io::file,
};
// Prepares an I/O read request.
export fn op_read(
	loop: *loop,
	file: io::file,
	buf: []u8,
	offs: u64,
	callback: *op_read_cb,
	user: nullable *opaque,
	flags: submission_flags
) (*submission | full | nomem) = {
	let sqe = match (io_uring::ring_get_sqe(&loop.io_uring)) {
	case null =>
		return full;
	case let s: *io_uring::sqe =>
		yield s;
	};
	io_uring::op_read(sqe, file: int, *(&buf: **opaque), len(buf), offs, flags: io_uring::sqe_flags);
	let ctx: op_ctx = op_read_ctx {
		callback = callback,
		user = user,
		file = file,
	};
	io_uring::sqe_set_data(sqe, alloc(ctx)?);
	return sqe: *submission;
};