Remove allocation for messages

This commit is contained in:
2025-05-10 21:19:25 -04:00
parent 583f9d8b8f
commit 716fb466fa
2 changed files with 20 additions and 33 deletions

View File

@@ -3,6 +3,8 @@ const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_cha
var rand: ?Random = null; var rand: ?Random = null;
const max_message_size = 2048;
pub fn init() !void { pub fn init() !void {
var prng = Random.DefaultPrng.init(blk: { var prng = Random.DefaultPrng.init(blk: {
var seed: u64 = undefined; var seed: u64 = undefined;
@@ -47,16 +49,12 @@ fn broadcastSaprusMessage(msg: *SaprusMessage, udp_port: u16) !void {
_ = try sock.sendTo(dest_addr, msg_bytes); _ = try sock.sendTo(dest_addr, msg_bytes);
} }
pub fn sendRelay(payload: []const u8, dest: [4]u8, allocator: Allocator) !void { pub fn sendRelay(payload: []const u8, dest: [4]u8) !void {
const msg_bytes = try allocator.alignedAlloc( var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
u8, const msg_bytes = buf[0..try SaprusMessage.calcSize(
@alignOf(SaprusMessage),
try SaprusMessage.lengthForPayloadLength(
.relay, .relay,
base64Enc.calcSize(payload.len), base64Enc.calcSize(payload.len),
), )];
);
defer allocator.free(msg_bytes);
const msg: *SaprusMessage = .init(.relay, msg_bytes); const msg: *SaprusMessage = .init(.relay, msg_bytes);
const relay = (try msg.getSaprusTypePayload()).relay; const relay = (try msg.getSaprusTypePayload()).relay;
@@ -75,18 +73,14 @@ fn randomPort() u16 {
return p; return p;
} }
pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: Allocator) !*SaprusMessage { pub fn sendInitialConnection(payload: []const u8, initial_port: u16) !*SaprusMessage {
const dest_port = randomPort(); const dest_port = randomPort();
const msg_bytes = try allocator.alignedAlloc( var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
u8, const msg_bytes = buf[0..try SaprusMessage.calcSize(
@alignOf(SaprusMessage),
try SaprusMessage.lengthForPayloadLength(
.connection, .connection,
base64Enc.calcSize(payload.len), base64Enc.calcSize(payload.len),
), )];
); const msg: *SaprusMessage = .init(.relay, msg_bytes);
const msg: *SaprusMessage = .init(.connection, msg_bytes);
const connection = (try msg.getSaprusTypePayload()).connection; const connection = (try msg.getSaprusTypePayload()).connection;
connection.src_port = initial_port; connection.src_port = initial_port;
@@ -98,11 +92,8 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator:
return msg; return msg;
} }
pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection { pub fn connect(payload: []const u8) !?SaprusConnection {
var initial_port: u16 = 0; const initial_port = randomPort();
if (rand) |r| {
initial_port = r.intRangeAtMost(u16, 1024, 65000);
} else unreachable;
var initial_conn_res: ?*SaprusMessage = null; var initial_conn_res: ?*SaprusMessage = null;
@@ -119,10 +110,9 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
try sock.setReadTimeout(1 * std.time.us_per_s); try sock.setReadTimeout(1 * std.time.us_per_s);
try sock.bind(bind_addr); try sock.bind(bind_addr);
const msg = try sendInitialConnection(payload, initial_port, allocator); const msg = try sendInitialConnection(payload, initial_port);
defer allocator.free(msg.asBytes());
var response_buf: [4096]u8 align(@alignOf(SaprusMessage)) = undefined; var response_buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
_ = try sock.receive(&response_buf); // Ignore message that I sent. _ = try sock.receive(&response_buf); // Ignore message that I sent.
const len = try sock.receive(&response_buf); const len = try sock.receive(&response_buf);
@@ -148,5 +138,3 @@ const mem = std.mem;
const network = @import("network"); const network = @import("network");
const gcat = @import("gatorcat"); const gcat = @import("gatorcat");
const Allocator = mem.Allocator;

View File

@@ -54,12 +54,11 @@ pub fn main() !void {
try SaprusClient.sendRelay( try SaprusClient.sendRelay(
if (r.len > 0) r else "Hello darkness my old friend", if (r.len > 0) r else "Hello darkness my old friend",
dest, dest,
gpa,
); );
// std.debug.print("Sent: {s}\n", .{r}); // std.debug.print("Sent: {s}\n", .{r});
return; return;
} else if (res.args.connect) |c| { } else if (res.args.connect) |c| {
_ = SaprusClient.connect(if (c.len > 0) c else "Hello darkness my old friend", gpa) catch |err| switch (err) { _ = SaprusClient.connect(if (c.len > 0) c else "Hello darkness my old friend") catch |err| switch (err) {
error.WouldBlock => null, error.WouldBlock => null,
else => return err, else => return err,
}; };