pollfd structure (draft), a few more mockup functions (server_init, wait_event...)
parent
69732ccad8
commit
1762f50100
|
@ -60,12 +60,13 @@ pub const Message = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
test "Message - creation and display" {
|
test "Message - creation and display" {
|
||||||
|
print("\n", .{});
|
||||||
// fd type usertype payload
|
// fd type usertype payload
|
||||||
var s = "hello!!";
|
var s = "hello!!";
|
||||||
var m = Message.init(1, MessageType.DATA, 3, s);
|
var m = Message.init(1, MessageType.DATA, 3, s);
|
||||||
|
|
||||||
print("\n", .{});
|
|
||||||
print("message:\t[{}]\n", .{m});
|
print("message:\t[{}]\n", .{m});
|
||||||
|
print("\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const Messages = std.ArrayList(Message);
|
pub const Messages = std.ArrayList(Message);
|
||||||
|
@ -173,14 +174,15 @@ pub const Event = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
test "Event - creation and display" {
|
test "Event - creation and display" {
|
||||||
|
print("\n", .{});
|
||||||
var s = "hello!!";
|
var s = "hello!!";
|
||||||
// fd type usertype payload
|
// fd type usertype payload
|
||||||
var m = Message.init(1, MessageType.DATA, 3, s);
|
var m = Message.init(1, MessageType.DATA, 3, s);
|
||||||
// type index origin message
|
// type index origin message
|
||||||
var e = Event.init(EventType.CONNECTION, 5, 8, &m);
|
var e = Event.init(EventType.CONNECTION, 5, 8, &m);
|
||||||
|
|
||||||
print("\n", .{});
|
|
||||||
print("event:\t[{}]\n", .{e});
|
print("event:\t[{}]\n", .{e});
|
||||||
|
print("\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const ConnectionType = enum {
|
pub const ConnectionType = enum {
|
||||||
|
@ -190,7 +192,13 @@ pub const ConnectionType = enum {
|
||||||
SWITCHED, // IO operations should go through registered callbacks.
|
SWITCHED, // IO operations should go through registered callbacks.
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Connection = struct {
|
// RATIONALE: a connection is mostly a file descriptor,
|
||||||
|
// but with a few other pieces of information.
|
||||||
|
// Storing all data related to a connection in a single place
|
||||||
|
// would be logical but very inefficient.
|
||||||
|
// File descriptors are stored elsewhere (in the context),
|
||||||
|
// packed together, in a single dedicated structure.
|
||||||
|
pub const ConnectionInfos = struct {
|
||||||
@"type": ConnectionType,
|
@"type": ConnectionType,
|
||||||
more_to_read: bool,
|
more_to_read: bool,
|
||||||
path: ?[] const u8, // Not always needed.
|
path: ?[] const u8, // Not always needed.
|
||||||
|
@ -217,14 +225,15 @@ pub const Connection = struct {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
test "Connection - creation and display" {
|
test "ConnectionInfos - creation and display" {
|
||||||
|
print("\n", .{});
|
||||||
// origin destination
|
// origin destination
|
||||||
var path = "/some/path";
|
var path = "/some/path";
|
||||||
var c1 = Connection.init(ConnectionType.EXTERNAL, path);
|
var c1 = ConnectionInfos.init(ConnectionType.EXTERNAL, path);
|
||||||
var c2 = Connection.init(ConnectionType.IPC , null);
|
var c2 = ConnectionInfos.init(ConnectionType.IPC , null);
|
||||||
print("\n", .{});
|
|
||||||
print("connection 1:\t[{}]\n", .{c1});
|
print("connection 1:\t[{}]\n", .{c1});
|
||||||
print("connection 2:\t[{}]\n", .{c2});
|
print("connection 2:\t[{}]\n", .{c2});
|
||||||
|
print("\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: callbacks.
|
// TODO: callbacks.
|
||||||
|
@ -260,18 +269,19 @@ pub const Switch = struct {
|
||||||
test "Switch - creation and display" {
|
test "Switch - creation and display" {
|
||||||
// origin destination
|
// origin destination
|
||||||
var s = Switch.init(3,8);
|
var s = Switch.init(3,8);
|
||||||
print("\n", .{});
|
|
||||||
print("switch:\t[{}]\n", .{s});
|
print("switch:\t[{}]\n", .{s});
|
||||||
|
print("\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const Switches = std.ArrayList(Switch);
|
pub const Switches = std.ArrayList(Switch);
|
||||||
|
pub const Connections = std.ArrayList(ConnectionInfos);
|
||||||
pub const Connections = std.ArrayList(Connection);
|
pub const PollFD = std.ArrayList(usize);
|
||||||
|
|
||||||
// Context of the whole networking state.
|
// Context of the whole networking state.
|
||||||
pub const Context = struct {
|
pub const Context = struct {
|
||||||
allocator: std.mem.Allocator, // Memory allocator.
|
allocator: std.mem.Allocator, // Memory allocator.
|
||||||
connections: Connections, // Keep track of connections.
|
connections: Connections, // Keep track of connections.
|
||||||
|
pollfd: PollFD, // File descriptors.
|
||||||
|
|
||||||
// TODO: List of "pollfd" structures within cinfos,
|
// TODO: List of "pollfd" structures within cinfos,
|
||||||
// so we can pass it to poll(2). Share indexes with 'connections'.
|
// so we can pass it to poll(2). Share indexes with 'connections'.
|
||||||
|
@ -283,27 +293,55 @@ pub const Context = struct {
|
||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
|
// Context initialization:
|
||||||
|
// - init structures (provide the allocator)
|
||||||
pub fn init(allocator: std.mem.Allocator) Self {
|
pub fn init(allocator: std.mem.Allocator) Self {
|
||||||
|
print("Context init\n", .{});
|
||||||
return Self {
|
return Self {
|
||||||
.connections = Connections.init(allocator)
|
.connections = Connections.init(allocator)
|
||||||
|
, .pollfd = PollFD.init(allocator)
|
||||||
, .tx = Messages.init(allocator)
|
, .tx = Messages.init(allocator)
|
||||||
, .switchdb = null
|
, .switchdb = null
|
||||||
, .allocator = allocator
|
, .allocator = allocator
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connect(self: *Self, path: []const u8) !void {
|
// Return the new fd. Can be useful to the caller.
|
||||||
|
pub fn connect(self: *Self, path: []const u8) !usize {
|
||||||
print("connection to {s}\n", .{path});
|
print("connection to {s}\n", .{path});
|
||||||
var newcon = Connection.init(ConnectionType.IPC, path);
|
const newfd = 0; // TODO
|
||||||
|
var newcon = ConnectionInfos.init(ConnectionType.IPC, path);
|
||||||
try self.connections.append(newcon);
|
try self.connections.append(newcon);
|
||||||
|
try self.pollfd.append(newfd);
|
||||||
|
return newfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a unix socket.
|
||||||
|
pub fn server_init(self: *Self, path: [] const u8) !usize {
|
||||||
|
print("context server init {s}\n", .{path});
|
||||||
|
const newfd = 0; // TODO
|
||||||
|
var newcon = ConnectionInfos.init(ConnectionType.SERVER, path);
|
||||||
|
try self.connections.append(newcon);
|
||||||
|
try self.pollfd.append(newfd);
|
||||||
|
return newfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait an event.
|
||||||
|
pub fn wait_event(self: *Self) !Event {
|
||||||
|
// TODO: this is a simple example.
|
||||||
|
for (self.pollfd.items) |fd| {
|
||||||
|
print("listening to fd {}\n", .{fd});
|
||||||
|
}
|
||||||
|
var event = Event.init(EventType.CONNECTION, 5, 8, null);
|
||||||
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *Self) void {
|
pub fn deinit(self: *Self) void {
|
||||||
print("connection deinit\n", .{});
|
print("connection deinit\n", .{});
|
||||||
self.connections.deinit();
|
self.connections.deinit();
|
||||||
|
self.pollfd.deinit();
|
||||||
self.tx.deinit();
|
self.tx.deinit();
|
||||||
if (self.switchdb) |sdb| { sdb.deinit(); }
|
if (self.switchdb) |sdb| { sdb.deinit(); }
|
||||||
self.tx.deinit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format(
|
pub fn format(
|
||||||
|
@ -331,10 +369,10 @@ pub const Context = struct {
|
||||||
|
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
test "Context - creation and display" {
|
test "Context - creation, display and memory check" {
|
||||||
|
print("\n", .{});
|
||||||
// origin destination
|
// origin destination
|
||||||
//var s = Switch.init(3,8);
|
//var s = Switch.init(3,8);
|
||||||
print("\n", .{});
|
|
||||||
|
|
||||||
const config = .{.safety = true};
|
const config = .{.safety = true};
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
var gpa = std.heap.GeneralPurposeAllocator(config){};
|
||||||
|
@ -352,9 +390,14 @@ test "Context - creation and display" {
|
||||||
var c = Context.init(allocator);
|
var c = 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?
|
||||||
|
|
||||||
try c.connect("/somewhere/over/the/rainbow");
|
// Creating a service.
|
||||||
|
_ = try c.server_init("/tmp/.TEST_USOCK");
|
||||||
|
|
||||||
|
// Connection to a service.
|
||||||
|
_ = try c.connect("/tmp/.TEST_USOCK");
|
||||||
|
|
||||||
print ("Context: {}\n", .{c});
|
print ("Context: {}\n", .{c});
|
||||||
|
print("\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() u8 {
|
pub fn main() u8 {
|
||||||
|
|
Reference in New Issue