Skip to content

Commit 60da9df

Browse files
committed
fix mem issue, switch to owned versions strings
1 parent b6a1881 commit 60da9df

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

src/nvml.zig

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,38 @@ const nvml_buf_size = c.NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE;
1313

1414
pub const Nvml = struct {
1515
allocator: std.mem.Allocator,
16-
driver_version: [driver_buf_size]u8,
17-
nvml_version: [nvml_buf_size]u8,
16+
driver_version: []u8, // owned memory
17+
nvml_version: []u8, // owned memory
1818
gpu_count: u32,
1919
gpus: []Gpu,
2020

2121
pub fn init(gpa: std.mem.Allocator) !Nvml {
2222
try nvmlCheck(c.nvmlInit());
2323

24-
var driver_version: [driver_buf_size]u8 = undefined;
25-
var nvml_version: [nvml_buf_size]u8 = undefined;
24+
var driver_version: [driver_buf_size:0]u8 = undefined;
25+
var nvml_version: [nvml_buf_size:0]u8 = undefined;
2626
// zig's usize = 64bits, nvml APIs expect c_uint = 32bits
2727
// so let's cast
2828
try nvmlCheck(c.nvmlSystemGetDriverVersion(&driver_version, @intCast(driver_version.len)));
2929
try nvmlCheck(c.nvmlSystemGetNVMLVersion(&nvml_version, @intCast(nvml_version.len)));
3030
var device_count: c_uint = 0;
3131
try nvmlCheck(c.nvmlDeviceGetCount(&device_count));
3232

33-
std.log.debug("NVML version: {s}", .{nvml_version});
34-
std.log.debug("driver version: {s}", .{driver_version});
33+
// memory copy C sliced buffers, as in gpu.zig init
34+
const owned_nvml_version = try gpa.dupe(u8, std.mem.sliceTo(&nvml_version, 0));
35+
const owned_driver_version = try gpa.dupe(u8, std.mem.sliceTo(&driver_version, 0));
36+
37+
std.log.debug("NVML version: {s}", .{owned_nvml_version});
38+
std.log.debug("driver version: {s}", .{owned_driver_version});
3539
std.log.debug("GPUs number: {d}", .{device_count});
3640

3741
var arr: std.ArrayList(Gpu) = .empty;
3842
errdefer {
3943
for (arr.items) |*g| g.deinit(gpa);
4044
arr.deinit(gpa);
4145
nvmlCheck(c.nvmlShutdown()) catch {};
46+
gpa.free(owned_nvml_version);
47+
gpa.free(owned_driver_version);
4248
}
4349

4450
for (0..device_count) |index| {
@@ -49,8 +55,8 @@ pub const Nvml = struct {
4955

5056
return Nvml{
5157
.allocator = gpa,
52-
.driver_version = driver_version,
53-
.nvml_version = nvml_version,
58+
.driver_version = owned_driver_version,
59+
.nvml_version = owned_nvml_version,
5460
.gpu_count = device_count,
5561
.gpus = gpus,
5662
};
@@ -59,7 +65,7 @@ pub const Nvml = struct {
5965
pub fn exec(self: *const Nvml, parsed: Parsed, config: ?UserConfig) !void {
6066
switch (parsed) {
6167
.query => |handler| {
62-
try handler.run(self.gpus, &self.driver_version);
68+
try handler.run(self.gpus, self.driver_version);
6369
},
6470
.set => |handler| {
6571
try handler.run(self.gpus);
@@ -92,7 +98,8 @@ pub const Nvml = struct {
9298
pub fn deinit(self: *Nvml) void {
9399
for (self.gpus) |*g| g.deinit(self.allocator);
94100
self.allocator.free(self.gpus);
95-
101+
self.allocator.free(self.nvml_version);
102+
self.allocator.free(self.driver_version);
96103
nvmlCheck(c.nvmlShutdown()) catch {};
97104
}
98105
};

0 commit comments

Comments
 (0)