Reduce heap allocations a bit

Signed-off-by: AnErrupTion <anerruption@disroot.org>
This commit is contained in:
AnErrupTion
2024-08-03 15:17:02 +02:00
parent b18f29a81a
commit 0bbe9c78dd
3 changed files with 19 additions and 33 deletions

View File

@@ -32,7 +32,7 @@ pub fn authenticate(config: Config, current_environment: Session.Environment, lo
// Set the XDG environment variables // Set the XDG environment variables
setXdgSessionEnv(current_environment.display_server); setXdgSessionEnv(current_environment.display_server);
try setXdgEnv(tty_str, current_environment.xdg_session_desktop, current_environment.xdg_desktop_names orelse ""); try setXdgEnv(tty_str, current_environment.xdg_session_desktop orelse "", current_environment.xdg_desktop_names orelse "");
// Open the PAM session // Open the PAM session
var credentials = [_:null]?[*:0]const u8{ login, password }; var credentials = [_:null]?[*:0]const u8{ login, password };

View File

@@ -234,13 +234,13 @@ pub fn main() !void {
var session = Session.init(allocator, &buffer, lang); var session = Session.init(allocator, &buffer, lang);
defer session.deinit(); defer session.deinit();
session.addEnvironment(.{ .Name = lang.shell }, "", .shell) catch { session.addEnvironment(.{ .Name = lang.shell }, null, .shell) catch {
try info_line.addMessage(lang.err_alloc, config.error_bg, config.error_fg); try info_line.addMessage(lang.err_alloc, config.error_bg, config.error_fg);
}; };
if (build_options.enable_x11_support) { if (build_options.enable_x11_support) {
if (config.xinitrc) |xinitrc| { if (config.xinitrc) |xinitrc| {
session.addEnvironment(.{ .Name = lang.xinitrc, .Exec = xinitrc }, "", .xinitrc) catch { session.addEnvironment(.{ .Name = lang.xinitrc, .Exec = xinitrc }, null, .xinitrc) catch {
try info_line.addMessage(lang.err_alloc, config.error_bg, config.error_fg); try info_line.addMessage(lang.err_alloc, config.error_bg, config.error_fg);
}; };
} }

View File

@@ -16,8 +16,8 @@ const Session = @This();
pub const Environment = struct { pub const Environment = struct {
entry_ini: ?Ini(Entry) = null, entry_ini: ?Ini(Entry) = null,
name: [:0]const u8 = "", name: [:0]const u8 = "",
xdg_session_desktop: [:0]const u8 = "", xdg_session_desktop: ?[:0]const u8 = null,
xdg_desktop_names: ?[:0]const u8 = "", xdg_desktop_names: ?[:0]const u8 = null,
cmd: []const u8 = "", cmd: []const u8 = "",
specifier: []const u8 = "", specifier: []const u8 = "",
display_server: DisplayServer = .wayland, display_server: DisplayServer = .wayland,
@@ -26,7 +26,7 @@ pub const Environment = struct {
const DesktopEntry = struct { const DesktopEntry = struct {
Exec: []const u8 = "", Exec: []const u8 = "",
Name: [:0]const u8 = "", Name: [:0]const u8 = "",
DesktopNames: ?[]const u8 = null, DesktopNames: ?[:0]u8 = null,
}; };
pub const Entry = struct { @"Desktop Entry": DesktopEntry = .{} }; pub const Entry = struct { @"Desktop Entry": DesktopEntry = .{} };
@@ -44,34 +44,25 @@ pub fn init(allocator: Allocator, buffer: *TerminalBuffer, lang: Lang) Session {
pub fn deinit(self: Session) void { pub fn deinit(self: Session) void {
for (self.label.list.items) |*environment| { for (self.label.list.items) |*environment| {
if (environment.entry_ini) |*entry_ini| entry_ini.deinit(); if (environment.entry_ini) |*entry_ini| entry_ini.deinit();
if (environment.xdg_desktop_names) |desktop_name| self.label.allocator.free(desktop_name); if (environment.xdg_session_desktop) |session_desktop| self.label.allocator.free(session_desktop);
self.label.allocator.free(environment.xdg_session_desktop);
} }
self.label.deinit(); self.label.deinit();
} }
pub fn addEnvironment(self: *Session, entry: DesktopEntry, xdg_session_desktop: []const u8, display_server: DisplayServer) !void { pub fn addEnvironment(self: *Session, entry: DesktopEntry, xdg_session_desktop: ?[:0]const u8, display_server: DisplayServer) !void {
var xdg_desktop_names: ?[:0]const u8 = null; var xdg_desktop_names: ?[:0]const u8 = null;
if (entry.DesktopNames) |desktop_names| { if (entry.DesktopNames) |desktop_names| {
const desktop_names_z = try self.label.allocator.dupeZ(u8, desktop_names); for (desktop_names) |*c| {
for (desktop_names_z) |*c| {
if (c.* == ';') c.* = ':'; if (c.* == ';') c.* = ':';
} }
xdg_desktop_names = desktop_names_z; xdg_desktop_names = desktop_names;
} }
errdefer {
if (xdg_desktop_names) |desktop_names| self.label.allocator.free(desktop_names);
}
const session_desktop = try self.label.allocator.dupeZ(u8, xdg_session_desktop);
errdefer self.label.allocator.free(session_desktop);
try self.label.addItem(.{ try self.label.addItem(.{
.entry_ini = null, .entry_ini = null,
.name = entry.Name, .name = entry.Name,
.xdg_session_desktop = session_desktop, .xdg_session_desktop = xdg_session_desktop,
.xdg_desktop_names = xdg_desktop_names, .xdg_desktop_names = xdg_desktop_names,
.cmd = entry.Exec, .cmd = entry.Exec,
.specifier = switch (display_server) { .specifier = switch (display_server) {
@@ -83,28 +74,20 @@ pub fn addEnvironment(self: *Session, entry: DesktopEntry, xdg_session_desktop:
}); });
} }
pub fn addEnvironmentWithIni(self: *Session, entry_ini: Ini(Entry), xdg_session_desktop: []const u8, display_server: DisplayServer) !void { pub fn addEnvironmentWithIni(self: *Session, entry_ini: Ini(Entry), xdg_session_desktop: ?[:0]const u8, display_server: DisplayServer) !void {
const entry = entry_ini.data.@"Desktop Entry"; const entry = entry_ini.data.@"Desktop Entry";
var xdg_desktop_names: ?[:0]const u8 = null; var xdg_desktop_names: ?[:0]const u8 = null;
if (entry.DesktopNames) |desktop_names| { if (entry.DesktopNames) |desktop_names| {
const desktop_names_z = try self.label.allocator.dupeZ(u8, desktop_names); for (desktop_names) |*c| {
for (desktop_names_z) |*c| {
if (c.* == ';') c.* = ':'; if (c.* == ';') c.* = ':';
} }
xdg_desktop_names = desktop_names_z; xdg_desktop_names = desktop_names;
} }
errdefer {
if (xdg_desktop_names) |desktop_names| self.label.allocator.free(desktop_names);
}
const session_desktop = try self.label.allocator.dupeZ(u8, xdg_session_desktop);
errdefer self.label.allocator.free(session_desktop);
try self.label.addItem(.{ try self.label.addItem(.{
.entry_ini = entry_ini, .entry_ini = entry_ini,
.name = entry.Name, .name = entry.Name,
.xdg_session_desktop = session_desktop, .xdg_session_desktop = xdg_session_desktop,
.xdg_desktop_names = xdg_desktop_names, .xdg_desktop_names = xdg_desktop_names,
.cmd = entry.Exec, .cmd = entry.Exec,
.specifier = switch (display_server) { .specifier = switch (display_server) {
@@ -139,7 +122,10 @@ pub fn crawl(self: *Session, path: []const u8, display_server: DisplayServer) !v
xdg_session_desktop = std.fs.path.stem(item.name); xdg_session_desktop = std.fs.path.stem(item.name);
} }
try self.addEnvironmentWithIni(entry_ini, xdg_session_desktop, display_server); const session_desktop = try self.label.allocator.dupeZ(u8, xdg_session_desktop);
errdefer self.label.allocator.free(session_desktop);
try self.addEnvironmentWithIni(entry_ini, session_desktop, display_server);
} }
} }