diff options
-rw-r--r-- | src/message.zig | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/src/message.zig b/src/message.zig index ae3507e..e932a73 100644 --- a/src/message.zig +++ b/src/message.zig @@ -36,9 +36,7 @@ pub const ZeroCopyMessage = packed struct { dest: @Vector(4, u8), payload: void, - const RSelf = *align(1) @This(); - - pub fn getPayload(self: RSelf) []u8 { + pub fn getPayload(self: *align(1) Relay) []u8 { const len: *u16 = @ptrFromInt(@intFromPtr(self) - @sizeOf(u16)); return @as([*]u8, @ptrCast(&self.payload))[0 .. len.* - @sizeOf(Relay)]; } @@ -52,21 +50,19 @@ pub const ZeroCopyMessage = packed struct { options: ConnectionOptions = .{}, payload: void, - const CSelf = *align(1) Connection; - - pub fn getPayload(self: CSelf) []u8 { + pub fn getPayload(self: *align(1) Connection) []u8 { const len: *u16 = @ptrFromInt(@intFromPtr(self) - @sizeOf(u16)); return @as([*]u8, @ptrCast(&self.payload))[0 .. len.* - @sizeOf(Connection)]; } - fn nativeFromNetworkEndian(self: CSelf) Error!void { + fn nativeFromNetworkEndian(self: *align(1) Connection) Error!void { self.src_port = bigToNative(@TypeOf(self.src_port), self.src_port); self.dest_port = bigToNative(@TypeOf(self.dest_port), self.dest_port); self.seq_num = bigToNative(@TypeOf(self.seq_num), self.seq_num); self.msg_id = bigToNative(@TypeOf(self.msg_id), self.msg_id); } - fn networkFromNativeEndian(self: CSelf) Error!void { + fn networkFromNativeEndian(self: *align(1) Connection) Error!void { self.src_port = nativeToBig(@TypeOf(self.src_port), self.src_port); self.dest_port = nativeToBig(@TypeOf(self.dest_port), self.dest_port); self.seq_num = nativeToBig(@TypeOf(self.seq_num), self.seq_num); @@ -80,14 +76,14 @@ pub const ZeroCopyMessage = packed struct { length: u16, bytes: void = {}, - fn getRelay(self: ZCM) Relay.RSelf { + fn getRelay(self: *Self) *align(1) Relay { return std.mem.bytesAsValue(Relay, &self.bytes); } - fn getConnection(self: ZCM) Connection.CSelf { + fn getConnection(self: *Self) *align(1) Connection { return std.mem.bytesAsValue(Connection, &self.bytes); } - pub fn getSaprusTypePayload(self: ZCM) Error!(union(PacketType) { + pub fn getSaprusTypePayload(self: *Self) Error!(union(PacketType) { relay: *align(1) Relay, file_transfer: void, connection: *align(1) Connection, @@ -100,7 +96,7 @@ pub const ZeroCopyMessage = packed struct { }; } - pub fn nativeFromNetworkEndian(self: ZCM) Error!void { + pub fn nativeFromNetworkEndian(self: *Self) Error!void { self.type = @enumFromInt(bigToNative( @typeInfo(@TypeOf(self.type)).@"enum".tag_type, @intFromEnum(self.type), @@ -114,7 +110,7 @@ pub const ZeroCopyMessage = packed struct { }; } - pub fn networkFromNativeEndian(self: ZCM) Error!void { + pub fn networkFromNativeEndian(self: *Self) Error!void { try switch (try self.getSaprusTypePayload()) { .relay => {}, .connection => |*con| con.*.networkFromNativeEndian(), @@ -128,26 +124,24 @@ pub const ZeroCopyMessage = packed struct { self.length = nativeToBig(@TypeOf(self.length), self.length); } - pub fn fromBytesUnchecked(bytes: []u8) ZCM { - return @ptrCast(bytes.ptr); + pub fn fromBytesUnchecked(bytes: []align(@alignOf(Self)) u8) *Self { + return @ptrCast(@alignCast(bytes.ptr)); } - pub fn fromBytes(bytes: []u8) !ZCM { - const res: ZCM = @ptrCast(bytes.ptr); + pub fn fromBytes(bytes: []align(@alignOf(Self)) u8) !*Self { + const res: *Self = @ptrCast(@alignCast(bytes.ptr)); return if (bytes.len == res.length + @sizeOf(Self)) res else Error.InvalidMessage; } }; -const ZCM = *align(1) ZeroCopyMessage; - test "testing variable length zero copy struct" { const gpa = std.testing.allocator; const payload_len = 48; - const bytes = try gpa.alloc(u8, @sizeOf(ZeroCopyMessage) + payload_len); + const bytes = try gpa.alignedAlloc(u8, @alignOf(ZeroCopyMessage), @sizeOf(ZeroCopyMessage) + payload_len); defer gpa.free(bytes); // Create a view of the byte slice as a ZeroCopyMessage - const zcm: ZCM = .fromBytesUnchecked(bytes); + const zcm: *ZeroCopyMessage = .fromBytesUnchecked(bytes); { // Set the message values |