Remove message type. It was useless: msg to IPCd is LOOKUP.
parent
4bbd5fc686
commit
d99a8d13e3
|
@ -137,7 +137,7 @@ pub const Context = struct {
|
||||||
// content: target service name;${IPC_NETWORK}
|
// content: target service name;${IPC_NETWORK}
|
||||||
// example: pong;pong tls://example.com:8998/pong
|
// example: pong;pong tls://example.com:8998/pong
|
||||||
|
|
||||||
var m = try Message.init (ipcdfd, Message.Type.LOOKUP, allocator, lookupfbs.getWritten());
|
var m = try Message.init (ipcdfd, allocator, lookupfbs.getWritten());
|
||||||
try self.write (m);
|
try self.write (m);
|
||||||
|
|
||||||
// Read LOOKUP response
|
// Read LOOKUP response
|
||||||
|
@ -310,7 +310,7 @@ pub const Context = struct {
|
||||||
|
|
||||||
// Wait an event.
|
// Wait an event.
|
||||||
pub fn wait_event(self: *Self) !Event {
|
pub fn wait_event(self: *Self) !Event {
|
||||||
var current_event: Event = Event.init(Event.Type.NOT_SET, 0, 0, null);
|
var current_event: Event = Event.init(Event.Type.ERROR, 0, 0, null);
|
||||||
var wait_duration: i32 = -1; // -1 == unlimited
|
var wait_duration: i32 = -1; // -1 == unlimited
|
||||||
|
|
||||||
if (self.timer) |t| { wait_duration = t; }
|
if (self.timer) |t| { wait_duration = t; }
|
||||||
|
@ -389,9 +389,6 @@ pub const Context = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (maybe_message) |m| {
|
if (maybe_message) |m| {
|
||||||
if (m.t == .LOOKUP) {
|
|
||||||
return Event.init(Event.Type.LOOKUP, i, fd.fd, m);
|
|
||||||
}
|
|
||||||
return Event.init(Event.Type.MESSAGE, i, fd.fd, m);
|
return Event.init(Event.Type.MESSAGE, i, fd.fd, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -505,7 +502,7 @@ pub const Context = struct {
|
||||||
// var s = Switch.init(3,8);
|
// var s = Switch.init(3,8);
|
||||||
// var payload = "hello!!";
|
// var payload = "hello!!";
|
||||||
// // fd type payload
|
// // fd type payload
|
||||||
// var m = Message.init(0, Message.Type.DATA, payload);
|
// var m = Message.init(0, allocator, payload);
|
||||||
//
|
//
|
||||||
// // type index origin message
|
// // type index origin message
|
||||||
// var e = Event.init(Event.Type.CONNECTION, 5, 8, &m);
|
// var e = Event.init(Event.Type.CONNECTION, 5, 8, &m);
|
||||||
|
@ -610,7 +607,7 @@ const ConnectThenSendMessageThread = struct {
|
||||||
var message_writer = message_fbs.writer();
|
var message_writer = message_fbs.writer();
|
||||||
// 'fd' parameter is not taken into account here (no loop)
|
// 'fd' parameter is not taken into account here (no loop)
|
||||||
|
|
||||||
var m = try Message.init(0, Message.Type.DATA, allocator, "Hello world!");
|
var m = try Message.init(0, allocator, "Hello world!");
|
||||||
defer m.deinit();
|
defer m.deinit();
|
||||||
_ = try m.write(message_writer);
|
_ = try m.write(message_writer);
|
||||||
|
|
||||||
|
|
|
@ -34,14 +34,12 @@ pub const Event = struct {
|
||||||
// to it. This is a lookup.
|
// to it. This is a lookup.
|
||||||
|
|
||||||
pub const Type = enum {
|
pub const Type = enum {
|
||||||
NOT_SET, // Default. TODO: should we keep this?
|
|
||||||
ERROR, // A problem occured.
|
ERROR, // A problem occured.
|
||||||
EXTERNAL, // Message received from a non IPC socket.
|
EXTERNAL, // Message received from a non IPC socket.
|
||||||
SWITCH, // Message to send to a corresponding fd.
|
SWITCH, // Message to send to a corresponding fd.
|
||||||
CONNECTION, // New user.
|
CONNECTION, // New user.
|
||||||
DISCONNECTION, // User disconnected.
|
DISCONNECTION, // User disconnected.
|
||||||
MESSAGE, // New message.
|
MESSAGE, // New message.
|
||||||
LOOKUP, // Client asking for a service through ipcd.
|
|
||||||
TIMER, // Timeout in the poll(2) function.
|
TIMER, // Timeout in the poll(2) function.
|
||||||
TX, // Message sent.
|
TX, // Message sent.
|
||||||
};
|
};
|
||||||
|
@ -65,7 +63,7 @@ pub const Event = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clean(self: *Self) void {
|
pub fn clean(self: *Self) void {
|
||||||
self.t = Event.Type.NOT_SET;
|
self.t = Event.Type.ERROR;
|
||||||
self.index = @as(usize,0);
|
self.index = @as(usize,0);
|
||||||
self.origin = @as(i32,0);
|
self.origin = @as(i32,0);
|
||||||
if (self.m) |message| {
|
if (self.m) |message| {
|
||||||
|
@ -89,9 +87,9 @@ test "Event - creation and display" {
|
||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
var s = "hello!!";
|
var s = "hello!!";
|
||||||
var m = try Message.init(1, Message.Type.DATA, allocator, s); // fd type payload
|
var m = try Message.init(1, allocator, s); // fd type payload
|
||||||
defer m.deinit();
|
defer m.deinit();
|
||||||
var e = Event.init(Event.Type.CONNECTION, 5, 8, m); // type index origin message
|
var e = Event.init(Event.Type.CONNECTION, 5, 8, m); // type index origin message
|
||||||
|
|
||||||
try print_eq("event.Event.Type.CONNECTION, origin: 8, index 5, message: [fd: 1, message.Message.Type.DATA, payload: [hello!!]]", e);
|
try print_eq("event.Event.Type.CONNECTION, origin: 8, index 5, message: [fd: 1, payload: [hello!!]]", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,18 +103,6 @@ fn create_service() !void {
|
||||||
},
|
},
|
||||||
|
|
||||||
.MESSAGE => {
|
.MESSAGE => {
|
||||||
if (some_event.m) |m| {
|
|
||||||
print("New message: {}\n", .{m});
|
|
||||||
print("Let's echo it...\n", .{});
|
|
||||||
try ctx.schedule(m);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
print("Error while receiving new message.\n", .{});
|
|
||||||
print("Ignoring...\n", .{});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
.LOOKUP => {
|
|
||||||
print("Client asking for a service through ipcd.\n", .{});
|
print("Client asking for a service through ipcd.\n", .{});
|
||||||
if (some_event.m) |m| {
|
if (some_event.m) |m| {
|
||||||
print("{}\n", .{m});
|
print("{}\n", .{m});
|
||||||
|
@ -162,7 +150,6 @@ fn create_service() !void {
|
||||||
// a message, meaning there is nothing to do. This should be
|
// a message, meaning there is nothing to do. This should be
|
||||||
// explicitely warned about.
|
// explicitely warned about.
|
||||||
var response = try Message.init(some_event.origin
|
var response = try Message.init(some_event.origin
|
||||||
, Message.Type.ERROR
|
|
||||||
, allocator
|
, allocator
|
||||||
, "lookup message without data");
|
, "lookup message without data");
|
||||||
try ctx.write(response);
|
try ctx.write(response);
|
||||||
|
@ -174,11 +161,6 @@ fn create_service() !void {
|
||||||
print("Message sent.\n", .{});
|
print("Message sent.\n", .{});
|
||||||
},
|
},
|
||||||
|
|
||||||
.NOT_SET => {
|
|
||||||
print("Event type not set. Something is wrong, let's suicide.\n", .{});
|
|
||||||
break;
|
|
||||||
},
|
|
||||||
|
|
||||||
.ERROR => {
|
.ERROR => {
|
||||||
print("A problem occured, event: {}, let's suicide\n", .{some_event});
|
print("A problem occured, event: {}, let's suicide\n", .{some_event});
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -11,14 +11,6 @@ pub const Messages = std.ArrayList(Message);
|
||||||
|
|
||||||
pub const Message = struct {
|
pub const Message = struct {
|
||||||
|
|
||||||
pub const Type = enum {
|
|
||||||
SERVER_CLOSE,
|
|
||||||
ERROR,
|
|
||||||
DATA,
|
|
||||||
LOOKUP,
|
|
||||||
};
|
|
||||||
|
|
||||||
t: Message.Type, // Internal message type.
|
|
||||||
fd: i32, // File descriptor concerned about this message.
|
fd: i32, // File descriptor concerned about this message.
|
||||||
payload: []const u8,
|
payload: []const u8,
|
||||||
|
|
||||||
|
@ -26,19 +18,10 @@ pub const Message = struct {
|
||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
// TODO
|
pub fn init(fd: i32
|
||||||
//pub fn initFromConnection(fd: i32) Self {
|
|
||||||
// return Self{
|
|
||||||
// .t = Message.Type.ERROR,
|
|
||||||
// .fd = fd,
|
|
||||||
// .payload = "hello",
|
|
||||||
// };
|
|
||||||
//}
|
|
||||||
|
|
||||||
pub fn init(fd: i32, t: Message.Type
|
|
||||||
, allocator: std.mem.Allocator
|
, allocator: std.mem.Allocator
|
||||||
, payload: []const u8) !Self {
|
, payload: []const u8) !Self {
|
||||||
return Message { .fd = fd, .t = t
|
return Message { .fd = fd
|
||||||
, .allocator = allocator
|
, .allocator = allocator
|
||||||
, .payload = try allocator.dupe(u8, payload) };
|
, .payload = try allocator.dupe(u8, payload) };
|
||||||
}
|
}
|
||||||
|
@ -49,34 +32,26 @@ pub const Message = struct {
|
||||||
|
|
||||||
pub fn read(fd: i32, buffer: []const u8, allocator: std.mem.Allocator) !Self {
|
pub fn read(fd: i32, buffer: []const u8, allocator: std.mem.Allocator) !Self {
|
||||||
|
|
||||||
// var hexbuf: [4000]u8 = undefined;
|
|
||||||
// var hexfbs = std.io.fixedBufferStream(&hexbuf);
|
|
||||||
// var hexwriter = hexfbs.writer();
|
|
||||||
// try hexdump.hexdump(hexwriter, "Message.read input buffer", buffer);
|
|
||||||
// print("{s}\n", .{hexfbs.getWritten()});
|
|
||||||
|
|
||||||
var fbs = std.io.fixedBufferStream(buffer);
|
var fbs = std.io.fixedBufferStream(buffer);
|
||||||
var reader = fbs.reader();
|
var reader = fbs.reader();
|
||||||
|
|
||||||
const msg_type = @intToEnum(Message.Type, try reader.readByte());
|
|
||||||
const msg_len = try reader.readIntBig(u32);
|
const msg_len = try reader.readIntBig(u32);
|
||||||
if (msg_len >= buffer.len) {
|
if (msg_len >= buffer.len - 4) {
|
||||||
return error.wrongMessageLength;
|
return error.wrongMessageLength;
|
||||||
}
|
}
|
||||||
const msg_payload = buffer[5..5+msg_len];
|
const msg_payload = buffer[4..4+msg_len];
|
||||||
|
|
||||||
return try Message.init(fd, msg_type, allocator, msg_payload);
|
return try Message.init(fd, allocator, msg_payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write(self: Self, writer: anytype) !usize {
|
pub fn write(self: Self, writer: anytype) !usize {
|
||||||
try writer.writeByte(@enumToInt(self.t));
|
|
||||||
try writer.writeIntBig(u32, @truncate(u32, self.payload.len));
|
try writer.writeIntBig(u32, @truncate(u32, self.payload.len));
|
||||||
return 5 + try writer.write(self.payload);
|
return 4 + try writer.write(self.payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format(self: Self, comptime _: []const u8, _: fmt.FormatOptions, out_stream: anytype) !void {
|
pub fn format(self: Self, comptime _: []const u8, _: fmt.FormatOptions, out_stream: anytype) !void {
|
||||||
try fmt.format(out_stream, "fd: {}, {}, payload: [{s}]",
|
try fmt.format(out_stream, "fd: {}, payload: [{s}]",
|
||||||
.{self.fd, self.t, self.payload} );
|
.{self.fd, self.payload} );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -88,10 +63,10 @@ test "Message - creation and display" {
|
||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
var s = "hello!!";
|
var s = "hello!!";
|
||||||
var m = try Message.init(1, Message.Type.DATA, allocator, s);
|
var m = try Message.init(1, allocator, s);
|
||||||
defer m.deinit();
|
defer m.deinit();
|
||||||
|
|
||||||
try print_eq("fd: 1, message.Message.Type.DATA, payload: [hello!!]", m);
|
try print_eq("fd: 1, payload: [hello!!]", m);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "Message - read and write" {
|
test "Message - read and write" {
|
||||||
|
@ -103,7 +78,7 @@ test "Message - read and write" {
|
||||||
|
|
||||||
// First, create a message.
|
// First, create a message.
|
||||||
var s = "hello!!";
|
var s = "hello!!";
|
||||||
var first_message = try Message.init(1, Message.Type.DATA, allocator, s);
|
var first_message = try Message.init(1, allocator, s);
|
||||||
defer first_message.deinit();
|
defer first_message.deinit();
|
||||||
|
|
||||||
// Test its content.
|
// Test its content.
|
||||||
|
|
|
@ -30,7 +30,7 @@ pub fn main() !u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
var pongfd = try ctx.connect_ipc(service_to_contact);
|
var pongfd = try ctx.connect_ipc(service_to_contact);
|
||||||
var message = try Message.init(pongfd, Message.Type.DATA, allocator, "bounce me");
|
var message = try Message.init(pongfd, allocator, "bounce me");
|
||||||
try ctx.schedule(message);
|
try ctx.schedule(message);
|
||||||
|
|
||||||
var some_event: ipc.Event = undefined;
|
var some_event: ipc.Event = undefined;
|
||||||
|
|
|
@ -60,7 +60,7 @@ fn create_service() !void {
|
||||||
try os.sigaction(os.SIG.HUP, &sa, null);
|
try os.sigaction(os.SIG.HUP, &sa, null);
|
||||||
|
|
||||||
var some_event: ipc.Event = undefined;
|
var some_event: ipc.Event = undefined;
|
||||||
ctx.timer = 10000; // 10 seconds
|
ctx.timer = 20000; // 2 seconds
|
||||||
var count: u32 = 0;
|
var count: u32 = 0;
|
||||||
while(! S.should_quit) {
|
while(! S.should_quit) {
|
||||||
some_event = try ctx.wait_event();
|
some_event = try ctx.wait_event();
|
||||||
|
|
Reference in New Issue