mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
terminal/kitty: minor stylistic changes to shm
This commit is contained in:
@ -102,53 +102,61 @@ pub const LoadingImage = struct {
|
|||||||
t: command.Transmission,
|
t: command.Transmission,
|
||||||
path: []const u8,
|
path: []const u8,
|
||||||
) !void {
|
) !void {
|
||||||
switch (builtin.target.os.tag) {
|
// windows is currently unsupported, does it support shm?
|
||||||
.windows => {
|
if (comptime builtin.target.os.tag == .windows) {
|
||||||
// TODO: support shared memory on windows
|
return error.UnsupportedMedium;
|
||||||
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);
|
// libc is required for shm_open
|
||||||
defer alloc.free(pathz);
|
if (comptime !builtin.link_libc) {
|
||||||
|
return error.UnsupportedMedium;
|
||||||
|
}
|
||||||
|
|
||||||
const fd = std.c.shm_open(pathz, @as(c_int, @bitCast(std.c.O{ .ACCMODE = .RDONLY })), 0);
|
// Since we're only supporting posix then max_path_bytes should
|
||||||
switch (std.posix.errno(fd)) {
|
// be enough to stack allocate the path.
|
||||||
.SUCCESS => {
|
var buf: [std.fs.max_path_bytes]u8 = undefined;
|
||||||
defer _ = std.c.close(fd);
|
const pathz = std.fmt.bufPrintZ(&buf, "{s}", .{path}) catch return error.InvalidData;
|
||||||
defer _ = std.c.shm_unlink(pathz);
|
|
||||||
|
|
||||||
const stat = std.posix.fstat(fd) catch |err| {
|
const fd = std.c.shm_open(pathz, @as(c_int, @bitCast(std.c.O{ .ACCMODE = .RDONLY })), 0);
|
||||||
log.warn("unable to fstat shared memory {s}: {}", .{ path, err });
|
switch (std.posix.errno(fd)) {
|
||||||
return error.InvalidData;
|
.SUCCESS => {},
|
||||||
};
|
else => |err| {
|
||||||
|
log.warn("unable to open shared memory {s}: {}", .{ path, err });
|
||||||
if (stat.size <= 0) return error.InvalidData;
|
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;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
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
|
/// Reads the data from a temporary file and returns it. This allocates
|
||||||
|
Reference in New Issue
Block a user