Skip to content

Commit ea9af21

Browse files
Remove heap allocation for Session
And adapt to similar changes on zig-js-runtime for Env Signed-off-by: Francis Bouvier <[email protected]>
1 parent efca715 commit ea9af21

File tree

5 files changed

+55
-47
lines changed

5 files changed

+55
-47
lines changed

src/browser/browser.zig

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,33 @@ const log = std.log.scoped(.browser);
4949
// A browser contains only one session.
5050
// TODO allow multiple sessions per browser.
5151
pub const Browser = struct {
52-
session: *Session,
52+
session: Session = undefined,
53+
54+
const uri = "about:blank";
5355

54-
pub fn init(alloc: std.mem.Allocator, loop: *Loop, vm: jsruntime.VM) !Browser {
56+
pub fn init(self: *Browser, alloc: std.mem.Allocator, loop: *Loop, vm: jsruntime.VM) !void {
5557
// We want to ensure the caller initialised a VM, but the browser
5658
// doesn't use it directly...
5759
_ = vm;
5860

59-
return Browser{
60-
.session = try Session.init(alloc, loop, "about:blank"),
61-
};
61+
try Session.init(&self.session, alloc, loop, uri);
6262
}
6363

6464
pub fn deinit(self: *Browser) void {
6565
self.session.deinit();
6666
}
6767

68-
pub fn newSession(self: *Browser, alloc: std.mem.Allocator, loop: *jsruntime.Loop) !void {
68+
pub fn newSession(
69+
self: *Browser,
70+
alloc: std.mem.Allocator,
71+
loop: *jsruntime.Loop,
72+
) !void {
6973
self.session.deinit();
70-
self.session = try Session.init(alloc, loop, "about:blank");
74+
try Session.init(&self.session, alloc, loop, uri);
7175
}
7276

7377
pub fn currentSession(self: *Browser) *Session {
74-
return self.session;
78+
return &self.session;
7579
}
7680
};
7781

@@ -99,13 +103,12 @@ pub const Session = struct {
99103
window: Window,
100104
// TODO move the shed to the browser?
101105
storageShed: storage.Shed,
102-
page: ?*Page = null,
106+
_page: ?Page = null,
103107
httpClient: HttpClient,
104108

105109
jstypes: [Types.len]usize = undefined,
106110

107-
fn init(alloc: std.mem.Allocator, loop: *Loop, uri: []const u8) !*Session {
108-
var self = try alloc.create(Session);
111+
fn init(self: *Session, alloc: std.mem.Allocator, loop: *Loop, uri: []const u8) !void {
109112
self.* = Session{
110113
.uri = uri,
111114
.alloc = alloc,
@@ -116,15 +119,13 @@ pub const Session = struct {
116119
.httpClient = undefined,
117120
};
118121

119-
self.env = try Env.init(self.arena.allocator(), loop, null);
122+
Env.init(&self.env, self.arena.allocator(), loop, null);
120123
self.httpClient = .{ .allocator = alloc, .loop = loop };
121124
try self.env.load(&self.jstypes);
122-
123-
return self;
124125
}
125126

126127
fn deinit(self: *Session) void {
127-
if (self.page) |page| page.end();
128+
if (self._page) |*p| p.end();
128129

129130
if (self.inspector) |inspector| {
130131
inspector.deinit(self.alloc);
@@ -136,7 +137,6 @@ pub const Session = struct {
136137
self.httpClient.deinit();
137138
self.loader.deinit();
138139
self.storageShed.deinit();
139-
self.alloc.destroy(self);
140140
}
141141

142142
pub fn initInspector(
@@ -158,8 +158,17 @@ pub const Session = struct {
158158
}
159159
}
160160

161-
pub fn createPage(self: *Session) !Page {
162-
return Page.init(self.alloc, self);
161+
pub fn createPage(self: *Session) !void {
162+
if (self._page != null) return error.SessionPageExists;
163+
const p: Page = undefined;
164+
self._page = p;
165+
Page.init(&self._page.?, self.alloc, self);
166+
}
167+
168+
// shortcut
169+
pub fn page(self: *Session) *Page {
170+
if (self._page) |*p| return p;
171+
@panic("No Page on this session");
163172
}
164173
};
165174

@@ -181,16 +190,14 @@ pub const Page = struct {
181190
raw_data: ?[]const u8 = null,
182191

183192
fn init(
193+
self: *Page,
184194
alloc: std.mem.Allocator,
185195
session: *Session,
186-
) !Page {
187-
if (session.page != null) return error.SessionPageExists;
188-
var page = Page{
196+
) void {
197+
self.* = .{
189198
.arena = std.heap.ArenaAllocator.init(alloc),
190199
.session = session,
191200
};
192-
session.page = &page;
193-
return page;
194201
}
195202

196203
// reset js env and mem arena.

src/cdp/page.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ fn navigate(
281281
try sendEvent(alloc, ctx, "Runtime.executionContextsCleared", void, {}, msg.sessionID);
282282

283283
// Launch navigate
284-
var p = try ctx.browser.currentSession().createPage();
284+
try ctx.browser.session.createPage();
285285
ctx.state.executionContextId += 1;
286286
const auxData = try std.fmt.allocPrint(
287287
alloc,
@@ -290,7 +290,7 @@ fn navigate(
290290
.{ctx.state.frameID},
291291
);
292292
defer alloc.free(auxData);
293-
_ = try p.navigate(params.url, auxData);
293+
try ctx.browser.session.page().navigate(params.url, auxData);
294294

295295
// Events
296296

src/main.zig

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -224,18 +224,10 @@ pub fn main() !void {
224224
defer srv.close();
225225
std.log.info("Listening on: {s}:{d}...", .{ host, port });
226226

227-
// create v8 vm
228-
const vm = jsruntime.VM.init();
229-
defer vm.deinit();
230-
231227
// loop
232228
var loop = try jsruntime.Loop.init(arena.allocator());
233229
defer loop.deinit();
234230

235-
// browser
236-
var browser = try Browser.init(arena.allocator(), &loop, vm);
237-
defer browser.deinit();
238-
239231
// listen
240-
try server.listen(&browser, &loop, srv.sockfd.?, std.time.ns_per_s * @as(u64, timeout));
232+
try server.listen(arena.allocator(), &loop, srv.sockfd.?, std.time.ns_per_s * @as(u64, timeout));
241233
}

src/main_get.zig

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,18 @@ pub fn main() !void {
8383
var loop = try jsruntime.Loop.init(allocator);
8484
defer loop.deinit();
8585

86-
var browser = try Browser.init(allocator, &loop, vm);
86+
var browser = Browser{};
87+
try Browser.init(&browser, allocator, &loop, vm);
8788
defer browser.deinit();
8889

89-
var page = try browser.currentSession().createPage();
90-
defer page.deinit();
90+
try browser.session.createPage();
9191

92-
try page.navigate(url, null);
93-
defer page.end();
92+
try browser.session.page().navigate(url, null);
93+
defer browser.session.page().end();
9494

95-
try page.wait();
95+
try browser.session.page().wait();
9696

9797
if (dump) {
98-
try page.dump(std.io.getStdOut());
98+
try browser.session.page().dump(std.io.getStdOut());
9999
}
100100
}

src/server.zig

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,12 @@ pub const Ctx = struct {
249249

250250
// allocator of the current session
251251
inline fn alloc(self: *Ctx) std.mem.Allocator {
252-
return self.browser.currentSession().alloc;
252+
return self.browser.session.alloc;
253253
}
254254

255255
// JS env of the current session
256256
inline fn env(self: Ctx) jsruntime.Env {
257-
return self.browser.currentSession().env;
257+
return self.browser.session.env;
258258
}
259259

260260
// actions
@@ -300,7 +300,7 @@ pub const Ctx = struct {
300300

301301
fn newSession(self: *Ctx) !void {
302302
try self.browser.newSession(self.alloc(), self.loop);
303-
try self.browser.currentSession().initInspector(
303+
try self.browser.session.initInspector(
304304
self,
305305
Ctx.onInspectorResp,
306306
Ctx.onInspectorNotif,
@@ -398,12 +398,21 @@ pub fn sendSync(ctx: *Ctx, msg: []const u8) !void {
398398
// ------
399399

400400
pub fn listen(
401-
browser: *Browser,
401+
alloc: std.mem.Allocator,
402402
loop: *jsruntime.Loop,
403403
server_socket: std.posix.socket_t,
404404
timeout: u64,
405405
) anyerror!void {
406406

407+
// create v8 vm
408+
const vm = jsruntime.VM.init();
409+
defer vm.deinit();
410+
411+
// browser
412+
var browser: Browser = undefined;
413+
try Browser.init(&browser, alloc, loop, vm);
414+
defer browser.deinit();
415+
407416
// create buffers
408417
var read_buf: [BufReadSize]u8 = undefined;
409418
var msg_buf = try MsgBuffer.init(loop.alloc, BufReadSize * 256); // 256KB
@@ -417,7 +426,7 @@ pub fn listen(
417426
// for accepting connections and receving messages
418427
var ctx = Ctx{
419428
.loop = loop,
420-
.browser = browser,
429+
.browser = &browser,
421430
.sessionNew = true,
422431
.read_buf = &read_buf,
423432
.msg_buf = &msg_buf,
@@ -426,7 +435,7 @@ pub fn listen(
426435
.conn_completion = &conn_completion,
427436
.timeout_completion = &timeout_completion,
428437
};
429-
try browser.currentSession().initInspector(
438+
try browser.session.initInspector(
430439
&ctx,
431440
Ctx.onInspectorResp,
432441
Ctx.onInspectorNotif,

0 commit comments

Comments
 (0)