From 6f5aa676b50178505c524c4aeece13fc33891497 Mon Sep 17 00:00:00 2001 From: Karchnu Date: Wed, 1 Jul 2020 16:24:13 +0200 Subject: [PATCH] Low-level changes for poll(2) version of the LibIPC. --- src/ipc/lowlevel.cr | 81 ++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/src/ipc/lowlevel.cr b/src/ipc/lowlevel.cr index 6a6b0a7..ed483d6 100644 --- a/src/ipc/lowlevel.cr +++ b/src/ipc/lowlevel.cr @@ -2,16 +2,21 @@ @[Link("ipc")] lib LibIPC struct Connection - version : LibC::UInt - index : LibC::UInt - fd : LibC::Int type : UInt8 spath : LibC::Char* # [4096] # [PATH_MAX] end - struct Connections - cinfos : Connection** - size : LibC::Int + struct Pollfd + fd : LibC::Int + events : LibC::Short + revents : LibC::Short + end + + struct Ctx + cinfos : Connection* + pollfd : Pollfd* + tx : Messages + size : LibC::UInt64 end struct Switching @@ -31,11 +36,18 @@ lib LibIPC LookUp end + # Messages are stored in lists within the libipc before being sent. + struct Messages + messages : Message* + size : LibC::UInt64 + end + struct Message - type : UInt8 - user_type : UInt8 - length : LibC::UInt - payload : LibC::Char* + type : UInt8 # Internal message type. + user_type : UInt8 # User-defined message type. + fd : LibC::Int # fd of the sender. + length : LibC::UInt # Payload length. + payload : LibC::Char* # end enum EventType @@ -51,9 +63,10 @@ lib LibIPC end struct Event - type : EventType - origin : Connection* - message : Message* + type : EventType # + index : LibC::UInt # Index of the sender in the ipc_ctx structure. + origin : LibC::Int # fd of the sender. + message : Message* # Pointer to the reveiced message. end struct IPCError @@ -62,36 +75,33 @@ lib LibIPC error_message : LibC::Char[8192] end - fun ipc_server_init(env : LibC::Char**, connection : Connection*, sname : LibC::Char*) : IPCError - fun ipc_server_close(Connection*) : IPCError - fun ipc_close(Connection*) : IPCError + # Connection functions. + # Context is allocated, ipcd is requested and the connection/initialisation is performed. + fun ipc_server_init(ctx : Ctx*, sname : LibC::Char*) : IPCError + fun ipc_connection(Ctx*, LibC::Char*) : IPCError - # connection to a service - fun ipc_connection(LibC::Char**, Connection*, LibC::Char*) : IPCError + # Closing connections. + fun ipc_close(ctx : Ctx*, index : LibC::UInt64) : IPCError + fun ipc_close_all(ctx : Ctx*) # Void - fun ipc_read(Connection*, Message*) : IPCError - fun ipc_write(Connection*, Message*) : IPCError + fun ipc_ctx_free(Ctx*) # Void - fun ipc_wait_event(Connections*, Connection*, Event*, LibC::Double*) : IPCError + # Loop function. + fun ipc_events_loop(Ctx*, Event*, LibC::UInt*) : IPCError - fun ipc_add(Connections*, Connection*) : IPCError - fun ipc_del(Connections*, Connection*) : IPCError - fun ipc_add_fd(Connections*, LibC::Int) : IPCError - fun ipc_del_fd(Connections*, LibC::Int) : IPCError + # Adding and removing file discriptors to read. + fun ipc_add(Ctx*, Connection*, Pollfd*) : IPCError + fun ipc_del(Ctx*, LibC::UInt) : IPCError + fun ipc_add_fd(Ctx*, LibC::Int) : IPCError + fun ipc_del_fd(Ctx*, LibC::Int) : IPCError - fun ipc_connection_gen(Connection*, LibC::UInt, LibC::UInt) : IPCError - - fun ipc_connections_free(Connections*) # Void - fun ipc_connections_close(Connections*) # Void + # Sending a message (will wait the fd to become available for IO operations). + fun ipc_write(Ctx*, Message*) : IPCError # This function let the user get the default error message based on the error code. # The error message is contained in the IPCError structure, this function should not be used, in most cases. fun ipc_errors_get (LibC::Int) : LibC::Char* - - # networkd-related functions - fun ipc_wait_event_networkd(Connections*, Connection*, Event*, Switchings*, LibC::Double*) : IPCError - fun ipc_receive_fd (sock : LibC::Int, fd : LibC::Int*) : IPCError fun ipc_provide_fd (sock : LibC::Int, fd : LibC::Int ) : IPCError @@ -100,7 +110,10 @@ lib LibIPC fun ipc_switching_get (switch : Switchings*, fd : LibC::Int ) : LibC::Int fun ipc_switching_free (switch : Switchings* ) # Void - # non public functions (for testing purposes) + # non public functions + fun ipc_read(Ctx*, index : LibC::UInt, Message*) : IPCError + + # for testing purposes fun ipc_switching_print (switch : Switchings*) # Void fun service_path (path : LibC::Char*, sname : LibC::Char*, index : Int32, version : Int32) : IPCError fun ipc_connections_print (Connections*) # Void