Skip to content

Commit

Permalink
terminal/kitty: minor stylistic changes to shm
Browse files Browse the repository at this point in the history
  • Loading branch information
mitchellh committed Aug 8, 2024
1 parent e2fe6bf commit c114979
Showing 1 changed file with 53 additions and 45 deletions.
98 changes: 53 additions & 45 deletions src/terminal/kitty/graphics_image.zig
Original file line number Diff line number Diff line change
Expand Up @@ -102,53 +102,61 @@ pub const LoadingImage = struct {
t: command.Transmission,
path: []const u8,
) !void {
switch (builtin.target.os.tag) {
.windows => {
// TODO: support shared memory on windows
return error.UnsupportedMedium;
},
else => {
// libc is required for shm_open
if (comptime !builtin.link_libc) return error.UnsupportedMedium;

const pathz = try alloc.dupeZ(u8, path);
defer alloc.free(pathz);

const fd = std.c.shm_open(pathz, @as(c_int, @bitCast(std.c.O{ .ACCMODE = .RDONLY })), 0);
switch (std.posix.errno(fd)) {
.SUCCESS => {
defer _ = std.c.close(fd);
defer _ = std.c.shm_unlink(pathz);

const stat = std.posix.fstat(fd) catch |err| {
log.warn("unable to fstat shared memory {s}: {}", .{ path, err });
return error.InvalidData;
};

if (stat.size <= 0) return error.InvalidData;

const size: usize = @intCast(stat.size);

const map = std.posix.mmap(null, size, std.c.PROT.READ, std.c.MAP{ .TYPE = .SHARED }, fd, 0) catch |err| {
log.warn("unable to mmap shared memory {s}: {}", .{ path, err });
return error.InvalidData;
};
defer std.posix.munmap(map);

const start: usize = @intCast(t.offset);
const end: usize = if (t.size > 0) @min(@as(usize, @intCast(t.offset)) + @as(usize, @intCast(t.size)), size) else size;

assert(self.data.items.len == 0);
try self.data.appendSlice(alloc, map[start..end]);
},

else => |err| {
log.warn("unable to open shared memory {s}: {}", .{ path, err });
return error.InvalidData;
},
}
// windows is currently unsupported, does it support shm?
if (comptime builtin.target.os.tag == .windows) {
return error.UnsupportedMedium;
}

// libc is required for shm_open
if (comptime !builtin.link_libc) {
return error.UnsupportedMedium;
}

// Since we're only supporting posix then max_path_bytes should
// be enough to stack allocate the path.
var buf: [std.fs.max_path_bytes]u8 = undefined;
const pathz = std.fmt.bufPrintZ(&buf, "{s}", .{path}) catch return error.InvalidData;

const fd = std.c.shm_open(pathz, @as(c_int, @bitCast(std.c.O{ .ACCMODE = .RDONLY })), 0);
switch (std.posix.errno(fd)) {
.SUCCESS => {},
else => |err| {
log.warn("unable to open shared memory {s}: {}", .{ path, err });
return error.InvalidData;
},
}
defer _ = std.c.close(fd);
defer _ = std.c.shm_unlink(pathz);

const stat = std.posix.fstat(fd) catch |err| {
log.warn("unable to fstat shared memory {s}: {}", .{ path, err });
return error.InvalidData;
};
if (stat.size <= 0) return error.InvalidData;

const size: usize = @intCast(stat.size);

const map = std.posix.mmap(
null,
size,
std.c.PROT.READ,
std.c.MAP{ .TYPE = .SHARED },
fd,
0,
) catch |err| {
log.warn("unable to mmap shared memory {s}: {}", .{ path, err });
return error.InvalidData;
};
defer std.posix.munmap(map);

const start: usize = @intCast(t.offset);
const end: usize = if (t.size > 0) @min(
@as(usize, @intCast(t.offset)) + @as(usize, @intCast(t.size)),
size,
) else size;

assert(self.data.items.len == 0);
try self.data.appendSlice(alloc, map[start..end]);
}

/// Reads the data from a temporary file and returns it. This allocates
Expand Down

0 comments on commit c114979

Please sign in to comment.