Grooming.
parent
2a714cd064
commit
49089b910b
|
@ -24,13 +24,13 @@ const Connections = @import("./connection.zig").Connections;
|
||||||
|
|
||||||
pub const PollFD = std.ArrayList(std.os.pollfd);
|
pub const PollFD = std.ArrayList(std.os.pollfd);
|
||||||
|
|
||||||
|
pub const IPC_HEADER_SIZE = 5; // Size (5 bytes) then content.
|
||||||
|
pub const IPC_BASE_SIZE = 2000000; // 2 MB, plenty enough space for messages
|
||||||
|
pub const IPC_MAX_MESSAGE_SIZE = IPC_BASE_SIZE-IPC_HEADER_SIZE;
|
||||||
|
pub const IPC_VERSION = 1;
|
||||||
|
|
||||||
// Context of the whole networking state.
|
// Context of the whole networking state.
|
||||||
pub const Context = struct {
|
pub const Context = struct {
|
||||||
pub const IPC_HEADER_SIZE = 5; // Size (5 bytes) then content.
|
|
||||||
pub const IPC_BASE_SIZE = 2000000; // 2 MB, plenty enough space for messages
|
|
||||||
pub const IPC_MAX_MESSAGE_SIZE = IPC_BASE_SIZE-IPC_HEADER_SIZE;
|
|
||||||
pub const IPC_VERSION = 1;
|
|
||||||
|
|
||||||
rundir: [] u8,
|
rundir: [] u8,
|
||||||
allocator: std.mem.Allocator, // Memory allocator.
|
allocator: std.mem.Allocator, // Memory allocator.
|
||||||
connections: Connections, // Keep track of connections.
|
connections: Connections, // Keep track of connections.
|
||||||
|
@ -38,8 +38,8 @@ pub const Context = struct {
|
||||||
// "pollfd" structures passed to poll(2). Same indexes as "connections".
|
// "pollfd" structures passed to poll(2). Same indexes as "connections".
|
||||||
pollfd: PollFD, // .fd (fd_t) + .events (i16) + .revents (i16)
|
pollfd: PollFD, // .fd (fd_t) + .events (i16) + .revents (i16)
|
||||||
|
|
||||||
tx: Messages, // Messages to send, once their fd is available.
|
tx: Messages, // Messages to send, once their fd is available.
|
||||||
switchdb: ?Switches, // Relations between fd.
|
switchdb: Switches, // Relations between fd.
|
||||||
|
|
||||||
timer: ?i32 = null, // No timer by default (no TIMER event).
|
timer: ?i32 = null, // No timer by default (no TIMER event).
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ pub const Context = struct {
|
||||||
, .connections = Connections.init(allocator)
|
, .connections = Connections.init(allocator)
|
||||||
, .pollfd = PollFD.init(allocator)
|
, .pollfd = PollFD.init(allocator)
|
||||||
, .tx = Messages.init(allocator)
|
, .tx = Messages.init(allocator)
|
||||||
, .switchdb = null
|
, .switchdb = try Switches.init(allocator)
|
||||||
, .allocator = allocator
|
, .allocator = allocator
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ pub const Context = struct {
|
||||||
m.deinit();
|
m.deinit();
|
||||||
}
|
}
|
||||||
self.tx.deinit();
|
self.tx.deinit();
|
||||||
if (self.switchdb) |sdb| { sdb.deinit(); }
|
self.switchdb.deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Both simple connection and the switched one share this code.
|
// Both simple connection and the switched one share this code.
|
||||||
|
@ -249,7 +249,7 @@ pub const Context = struct {
|
||||||
try self.server_path(service_name, writer);
|
try self.server_path(service_name, writer);
|
||||||
var path = fbs.getWritten();
|
var path = fbs.getWritten();
|
||||||
|
|
||||||
print("context server init {s}\n", .{path});
|
// print("context server init {s}\n", .{path});
|
||||||
var server = net.StreamServer.init(.{});
|
var server = net.StreamServer.init(.{});
|
||||||
var socket_addr = try net.Address.initUnix(path);
|
var socket_addr = try net.Address.initUnix(path);
|
||||||
try server.listen(socket_addr);
|
try server.listen(socket_addr);
|
||||||
|
@ -267,7 +267,7 @@ pub const Context = struct {
|
||||||
// a Stream from the fd.
|
// a Stream from the fd.
|
||||||
var stream = net.Stream { .handle = m.fd };
|
var stream = net.Stream { .handle = m.fd };
|
||||||
|
|
||||||
var buffer: [1000]u8 = undefined;
|
var buffer: [IPC_MAX_MESSAGE_SIZE]u8 = undefined;
|
||||||
var fbs = std.io.fixedBufferStream(&buffer);
|
var fbs = std.io.fixedBufferStream(&buffer);
|
||||||
var writer = fbs.writer();
|
var writer = fbs.writer();
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ pub const Context = struct {
|
||||||
return error.IndexOutOfBounds;
|
return error.IndexOutOfBounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer: [2000000]u8 = undefined; // TODO: FIXME??
|
var buffer: [IPC_MAX_MESSAGE_SIZE]u8 = undefined; // TODO: FIXME??
|
||||||
var packet_size: usize = undefined;
|
var packet_size: usize = undefined;
|
||||||
|
|
||||||
// TODO: this is a problem from the network API in Zig,
|
// TODO: this is a problem from the network API in Zig,
|
||||||
|
@ -556,14 +556,13 @@ test "Context - creation, display and memory check" {
|
||||||
var path = fbs.getWritten();
|
var path = fbs.getWritten();
|
||||||
|
|
||||||
// SERVER SIDE: creating a service.
|
// SERVER SIDE: creating a service.
|
||||||
var server = c.server_init(path) catch |err| switch(err) {
|
var server = c.server_init("simple-context-test") catch |err| switch(err) {
|
||||||
error.FileNotFound => {
|
error.FileNotFound => {
|
||||||
print ("\nError: cannot init server at {s}\n", .{path});
|
print ("\nError: cannot init server at {s}\n", .{path});
|
||||||
return err;
|
return err;
|
||||||
},
|
},
|
||||||
else => return err,
|
else => return err,
|
||||||
};
|
};
|
||||||
defer server.deinit();
|
|
||||||
defer std.fs.cwd().deleteFile(path) catch {}; // Once done, remove file.
|
defer std.fs.cwd().deleteFile(path) catch {}; // Once done, remove file.
|
||||||
|
|
||||||
const t = try std.Thread.spawn(.{}, CommunicationTestThread.clientFn, .{});
|
const t = try std.Thread.spawn(.{}, CommunicationTestThread.clientFn, .{});
|
||||||
|
@ -616,45 +615,43 @@ const ConnectThenSendMessageThread = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
test "Context - creation, echo once" {
|
test "Context - creation, echo once" {
|
||||||
const config = .{.safety = true};
|
const config = .{.safety = true};
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
||||||
defer _ = gpa.deinit();
|
defer _ = gpa.deinit();
|
||||||
|
|
||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
var c = try Context.init(allocator);
|
var c = try Context.init(allocator);
|
||||||
defer c.deinit(); // There. Can't leak. Isn't Zig wonderful?
|
defer c.deinit(); // There. Can't leak. Isn't Zig wonderful?
|
||||||
|
|
||||||
var buffer: [1000]u8 = undefined;
|
var buffer: [1000]u8 = undefined;
|
||||||
var fbs = std.io.fixedBufferStream(&buffer);
|
var fbs = std.io.fixedBufferStream(&buffer);
|
||||||
var writer = fbs.writer();
|
var writer = fbs.writer();
|
||||||
try c.server_path("simple-context-test", writer);
|
try c.server_path("simple-context-test", writer);
|
||||||
var path = fbs.getWritten();
|
var path = fbs.getWritten();
|
||||||
|
|
||||||
// SERVER SIDE: creating a service.
|
// SERVER SIDE: creating a service.
|
||||||
var server = c.server_init(path) catch |err| switch(err) {
|
var server = c.server_init("simple-context-test") catch |err| switch(err) {
|
||||||
error.FileNotFound => {
|
error.FileNotFound => {
|
||||||
print ("\nError: cannot init server at {s}\n", .{path});
|
print ("\nError: cannot init server at {s}\n", .{path});
|
||||||
return err;
|
return err;
|
||||||
},
|
},
|
||||||
else => return err,
|
else => return err,
|
||||||
};
|
};
|
||||||
defer server.deinit();
|
defer std.fs.cwd().deleteFile(path) catch {}; // Once done, remove file.
|
||||||
defer std.fs.cwd().deleteFile(path) catch {}; // Once done, remove file.
|
|
||||||
|
|
||||||
const t = try std.Thread.spawn(.{}, ConnectThenSendMessageThread.clientFn, .{});
|
const t = try std.Thread.spawn(.{}, ConnectThenSendMessageThread.clientFn, .{});
|
||||||
defer t.join();
|
defer t.join();
|
||||||
|
|
||||||
// Server.accept returns a net.StreamServer.Connection.
|
// Server.accept returns a net.StreamServer.Connection.
|
||||||
var client = try server.accept();
|
var client = try server.accept();
|
||||||
defer client.stream.close();
|
defer client.stream.close();
|
||||||
var buf: [1000]u8 = undefined;
|
var buf: [1000]u8 = undefined;
|
||||||
const n = try client.stream.reader().read(&buf);
|
const n = try client.stream.reader().read(&buf);
|
||||||
var m = try Message.read(8, buf[0..n], allocator); // 8 == random client's fd number
|
var m = try Message.read(8, buf[0..n], allocator); // 8 == random client's fd number
|
||||||
defer m.deinit();
|
defer m.deinit();
|
||||||
|
|
||||||
try testing.expectEqual(@as(usize, 12), m.payload.len);
|
|
||||||
try testing.expectEqualSlices(u8, m.payload, "Hello world!");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
try testing.expectEqual(@as(usize, 12), m.payload.len);
|
||||||
|
try testing.expectEqualSlices(u8, m.payload, "Hello world!");
|
||||||
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@ pub const Message = struct {
|
||||||
var fbs = std.io.fixedBufferStream(buffer);
|
var fbs = std.io.fixedBufferStream(buffer);
|
||||||
var reader = fbs.reader();
|
var reader = fbs.reader();
|
||||||
|
|
||||||
const msg_len = try reader.readIntBig(u32);
|
const msg_len = try reader.readIntBig(u32);
|
||||||
if (msg_len >= buffer.len - 4) {
|
if (msg_len > buffer.len - 4) {
|
||||||
return error.wrongMessageLength;
|
return error.wrongMessageLength;
|
||||||
}
|
}
|
||||||
const msg_payload = buffer[4..4+msg_len];
|
const msg_payload = buffer[4..4+msg_len];
|
||||||
|
@ -56,21 +56,20 @@ pub const Message = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
test "Message - creation and display" {
|
test "Message - creation and display" {
|
||||||
// fd type payload
|
// fd payload
|
||||||
const config = .{.safety = true};
|
const config = .{.safety = true};
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
||||||
defer _ = gpa.deinit();
|
defer _ = gpa.deinit();
|
||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
var s = "hello!!";
|
var m = try Message.init(1, allocator, "hello!!");
|
||||||
var m = try Message.init(1, allocator, s);
|
|
||||||
defer m.deinit();
|
defer m.deinit();
|
||||||
|
|
||||||
try print_eq("fd: 1, payload: [hello!!]", m);
|
try print_eq("fd: 1, payload: [hello!!]", m);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "Message - read and write" {
|
test "Message - read and write" {
|
||||||
// fd type payload
|
// fd payload
|
||||||
const config = .{.safety = true};
|
const config = .{.safety = true};
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
||||||
defer _ = gpa.deinit();
|
defer _ = gpa.deinit();
|
||||||
|
|
Reference in New Issue