Skip to content

Commit d115261

Browse files
Merge pull request #260 from lightpanda-io/tick
loop: add IO methods and remove Tick usage
2 parents 2ddca8b + d0e006b commit d115261

File tree

2 files changed

+75
-96
lines changed

2 files changed

+75
-96
lines changed

src/loop.zig

Lines changed: 74 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ pub const SingleThreaded = struct {
4444
cbk_error: bool = false,
4545

4646
const Self = @This();
47+
pub const Completion = IO.Completion;
48+
49+
pub const ConnectError = IO.ConnectError;
50+
pub const RecvError = IO.RecvError;
51+
pub const SendError = IO.SendError;
4752

4853
pub fn init(alloc: std.mem.Allocator) !Self {
4954
const io = try alloc.create(IO);
@@ -66,7 +71,7 @@ pub const SingleThreaded = struct {
6671
// on the go when they are executed (ie. nested I/O events).
6772
pub fn run(self: *Self) !void {
6873
while (self.eventsNb() > 0) {
69-
try self.io.tick();
74+
try self.io.run_for_ns(10 * std.time.ns_per_ms);
7075
// at each iteration we might have new events registred by previous callbacks
7176
}
7277
// TODO: return instead immediatly on the first JS callback error
@@ -97,8 +102,8 @@ pub const SingleThreaded = struct {
97102
self.alloc.destroy(ctx);
98103
}
99104

100-
// Callback-based APIs
101-
// -------------------
105+
// JS callbacks APIs
106+
// -----------------
102107

103108
// Timeout
104109

@@ -207,107 +212,81 @@ pub const SingleThreaded = struct {
207212
}
208213
}
209214

210-
// Yield
211-
pub fn Yield(comptime Ctx: type) type {
212-
// TODO check ctx interface funcs:
213-
// - onYield(ctx: *Ctx, ?anyerror) void
214-
return struct {
215-
const YieldImpl = @This();
216-
const Loop = Self;
217-
218-
loop: *Loop,
219-
ctx: *Ctx,
220-
completion: IO.Completion,
221-
222-
pub fn init(loop: *Loop) YieldImpl {
223-
return .{
224-
.loop = loop,
225-
.completion = undefined,
226-
.ctx = undefined,
227-
};
228-
}
229-
230-
pub fn tick(self: *YieldImpl) !void {
231-
return try self.loop.io.tick();
232-
}
215+
// IO callbacks APIs
216+
// -----------------
233217

234-
pub fn yield(self: *YieldImpl, ctx: *Ctx) void {
235-
self.ctx = ctx;
236-
_ = self.loop.addEvent();
237-
self.loop.io.timeout(*YieldImpl, self, YieldImpl.yieldCbk, &self.completion, 0);
238-
}
218+
// Connect
239219

240-
fn yieldCbk(self: *YieldImpl, _: *IO.Completion, result: IO.TimeoutError!void) void {
241-
_ = self.loop.removeEvent();
242-
_ = result catch |err| return self.ctx.onYield(err);
243-
return self.ctx.onYield(null);
244-
}
245-
};
220+
pub fn connect(
221+
self: *Self,
222+
comptime Ctx: type,
223+
ctx: *Ctx,
224+
completion: *Completion,
225+
comptime cbk: fn (ctx: *Ctx, _: *Completion, res: ConnectError!void) void,
226+
socket: std.posix.socket_t,
227+
address: std.net.Address,
228+
) void {
229+
const old_events_nb = self.addEvent();
230+
self.io.connect(*Ctx, ctx, cbk, completion, socket, address);
231+
if (builtin.is_test) {
232+
report("start connect {d}", .{old_events_nb + 1});
233+
}
246234
}
247235

248-
// Network
249-
pub fn Network(comptime Ctx: type) type {
250-
251-
// TODO check ctx interface funcs:
252-
// - onConnect(ctx: *Ctx, ?anyerror) void
253-
// - onReceive(ctx: *Ctx, usize, ?anyerror) void
254-
// - onSend(ctx: *Ctx, usize, ?anyerror) void
255-
256-
return struct {
257-
const NetworkImpl = @This();
258-
const Loop = Self;
259-
260-
loop: *Loop,
261-
ctx: *Ctx,
262-
completion: IO.Completion,
263-
264-
pub fn init(loop: *Loop) NetworkImpl {
265-
return .{
266-
.loop = loop,
267-
.completion = undefined,
268-
.ctx = undefined,
269-
};
270-
}
271-
272-
pub fn tick(self: *NetworkImpl) !void {
273-
return try self.loop.io.tick();
274-
}
236+
pub fn onConnect(self: *Self, _: ConnectError!void) void {
237+
const old_events_nb = self.removeEvent();
238+
if (builtin.is_test) {
239+
report("connect done, remaining events: {d}", .{old_events_nb - 1});
240+
}
241+
}
275242

276-
pub fn connect(self: *NetworkImpl, ctx: *Ctx, socket: std.posix.socket_t, address: std.net.Address) void {
277-
self.ctx = ctx;
278-
_ = self.loop.addEvent();
279-
self.loop.io.connect(*NetworkImpl, self, NetworkImpl.connectCbk, &self.completion, socket, address);
280-
}
243+
// Send
281244

282-
fn connectCbk(self: *NetworkImpl, _: *IO.Completion, result: IO.ConnectError!void) void {
283-
_ = self.loop.removeEvent();
284-
_ = result catch |err| return self.ctx.onConnect(err);
285-
return self.ctx.onConnect(null);
286-
}
245+
pub fn send(
246+
self: *Self,
247+
comptime Ctx: type,
248+
ctx: *Ctx,
249+
completion: *Completion,
250+
comptime cbk: fn (ctx: *Ctx, completion: *Completion, res: SendError!usize) void,
251+
socket: std.posix.socket_t,
252+
buf: []const u8,
253+
) void {
254+
const old_events_nb = self.addEvent();
255+
self.io.send(*Ctx, ctx, cbk, completion, socket, buf);
256+
if (builtin.is_test) {
257+
report("start send {d}", .{old_events_nb + 1});
258+
}
259+
}
287260

288-
pub fn receive(self: *NetworkImpl, ctx: *Ctx, socket: std.posix.socket_t, buffer: []u8) void {
289-
self.ctx = ctx;
290-
_ = self.loop.addEvent();
291-
self.loop.io.recv(*NetworkImpl, self, NetworkImpl.receiveCbk, &self.completion, socket, buffer);
292-
}
261+
pub fn onSend(self: *Self, _: SendError!usize) void {
262+
const old_events_nb = self.removeEvent();
263+
if (builtin.is_test) {
264+
report("send done, remaining events: {d}", .{old_events_nb - 1});
265+
}
266+
}
293267

294-
fn receiveCbk(self: *NetworkImpl, _: *IO.Completion, result: IO.RecvError!usize) void {
295-
_ = self.loop.removeEvent();
296-
const ln = result catch |err| return self.ctx.onReceive(0, err);
297-
return self.ctx.onReceive(ln, null);
298-
}
268+
// Recv
299269

300-
pub fn send(self: *NetworkImpl, ctx: *Ctx, socket: std.posix.socket_t, buffer: []const u8) void {
301-
self.ctx = ctx;
302-
_ = self.loop.addEvent();
303-
self.loop.io.send(*NetworkImpl, self, NetworkImpl.sendCbk, &self.completion, socket, buffer);
304-
}
270+
pub fn recv(
271+
self: *Self,
272+
comptime Ctx: type,
273+
ctx: *Ctx,
274+
completion: *Completion,
275+
comptime cbk: fn (ctx: *Ctx, completion: *Completion, res: RecvError!usize) void,
276+
socket: std.posix.socket_t,
277+
buf: []u8,
278+
) void {
279+
const old_events_nb = self.addEvent();
280+
self.io.recv(*Ctx, ctx, cbk, completion, socket, buf);
281+
if (builtin.is_test) {
282+
report("start recv {d}", .{old_events_nb + 1});
283+
}
284+
}
305285

306-
fn sendCbk(self: *NetworkImpl, _: *IO.Completion, result: IO.SendError!usize) void {
307-
_ = self.loop.removeEvent();
308-
const ln = result catch |err| return self.ctx.onSend(0, err);
309-
return self.ctx.onSend(ln, null);
310-
}
311-
};
286+
pub fn onRecv(self: *Self, _: RecvError!usize) void {
287+
const old_events_nb = self.removeEvent();
288+
if (builtin.is_test) {
289+
report("recv done, remaining events: {d}", .{old_events_nb - 1});
290+
}
312291
}
313292
};

src/shell.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ pub fn shellExec(
224224
// - user input command from repl
225225
// - JS callbacks events from scripts
226226
while (true) {
227-
try loop.io.tick();
227+
try loop.io.run_for_ns(10 * std.time.ns_per_ms);
228228
if (loop.cbk_error) {
229229
if (try try_catch.exception(alloc, js_env.*)) |msg| {
230230
defer alloc.free(msg);

0 commit comments

Comments
 (0)