v0.4: ipc_wait_event* functions now reveive a timeout value
parent
9793d5ac6a
commit
5b134a8c1b
|
@ -93,6 +93,8 @@ class IPC::StandAloneConnection
|
|||
end
|
||||
|
||||
class IPC::Connections
|
||||
property base_timer : Int64 = 0
|
||||
property timer : Int64 = 0
|
||||
getter connections : LibIPC::Connections
|
||||
|
||||
def initialize
|
||||
|
@ -143,27 +145,42 @@ class IPC::Connections
|
|||
serverp = server.pointer
|
||||
end
|
||||
|
||||
r = LibIPC.ipc_wait_event self.pointer, serverp, pointerof(event)
|
||||
r = LibIPC.ipc_wait_event self.pointer, serverp, pointerof(event), pointerof(@timer)
|
||||
if r != 0
|
||||
m = String.new LibIPC.ipc_errors_get (r)
|
||||
yield IPC::Exception.new "error waiting for a new event: #{m}"
|
||||
end
|
||||
|
||||
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
||||
|
||||
# if event type is Timer, there is no connection nor message
|
||||
case eventtype
|
||||
when LibIPC::EventType::Timer
|
||||
return eventtype, nil, nil
|
||||
end
|
||||
|
||||
connection = IPC::Connection.new event.origin.unsafe_as(Pointer(LibIPC::Connection)).value
|
||||
|
||||
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
||||
message = event.message.unsafe_as(Pointer(LibIPC::Message))
|
||||
|
||||
return eventtype, IPC::Message.new(message), connection
|
||||
end
|
||||
|
||||
def loop(server : IPC::Connection | IPC::Server | ::Nil, &block : Proc(Events|Exception, Nil))
|
||||
if @base_timer > 0 && @timer == 0
|
||||
@timer = @base_timer
|
||||
end
|
||||
|
||||
::loop do
|
||||
type, message, connection = wait_event server, &block
|
||||
|
||||
case type
|
||||
when LibIPC::EventType::Timer
|
||||
# reset timer
|
||||
@timer = @base_timer
|
||||
yield IPC::Event::Timer.new
|
||||
when LibIPC::EventType::Connection
|
||||
yield IPC::Event::Connection.new connection
|
||||
yield IPC::Event::Connection.new connection.not_nil!
|
||||
|
||||
when LibIPC::EventType::NotSet
|
||||
yield IPC::Exception.new "even type not set"
|
||||
|
@ -172,13 +189,13 @@ class IPC::Connections
|
|||
yield IPC::Exception.new "even type indicates an error"
|
||||
|
||||
when LibIPC::EventType::ExtraSocket
|
||||
yield IPC::Event::ExtraSocket.new message, connection
|
||||
yield IPC::Event::ExtraSocket.new message.not_nil!, connection.not_nil!
|
||||
|
||||
when LibIPC::EventType::Switch
|
||||
yield IPC::Event::Switch.new message, connection
|
||||
yield IPC::Event::Switch.new message.not_nil!, connection.not_nil!
|
||||
|
||||
when LibIPC::EventType::Message
|
||||
yield IPC::Event::Message.new message, connection
|
||||
yield IPC::Event::Message.new message.not_nil!, connection.not_nil!
|
||||
|
||||
# for now, the libipc does not provide lookup events
|
||||
# networkd uses a simple LibIPC::EventType::Message
|
||||
|
@ -186,7 +203,7 @@ class IPC::Connections
|
|||
# yield IPC::Event::LookUp.new message, connection
|
||||
|
||||
when LibIPC::EventType::Disconnection
|
||||
yield IPC::Event::Disconnection.new connection
|
||||
yield IPC::Event::Disconnection.new connection.not_nil!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,6 +3,9 @@ require "./message"
|
|||
require "./connection"
|
||||
|
||||
class IPC::Event
|
||||
class Timer
|
||||
end
|
||||
|
||||
class Connection
|
||||
getter connection : IPC::Connection
|
||||
def initialize(@connection)
|
||||
|
@ -32,5 +35,5 @@ class IPC::Event
|
|||
end
|
||||
end
|
||||
|
||||
alias Events = IPC::Event::Connection | IPC::Event::Disconnection | IPC::Event::Message | IPC::Event::ExtraSocket | IPC::Event::Switch | IPC::Event::LookUp
|
||||
alias Events = IPC::Event::Timer | IPC::Event::Connection | IPC::Event::Disconnection | IPC::Event::Message | IPC::Event::ExtraSocket | IPC::Event::Switch | IPC::Event::LookUp
|
||||
|
||||
|
|
|
@ -111,6 +111,7 @@ lib LibIPC
|
|||
Disconnection
|
||||
Message
|
||||
LookUp
|
||||
Timer
|
||||
end
|
||||
|
||||
struct Event
|
||||
|
@ -129,7 +130,7 @@ lib LibIPC
|
|||
fun ipc_read(Connection*, Message*) : LibC::Int
|
||||
fun ipc_write(Connection*, Message*) : LibC::Int
|
||||
|
||||
fun ipc_wait_event(Connections*, Connection*, Event*) : LibC::Int
|
||||
fun ipc_wait_event(Connections*, Connection*, Event*, LibC::Long*) : LibC::Int
|
||||
|
||||
fun ipc_add(Connections*, Connection*) : LibC::Int
|
||||
fun ipc_del(Connections*, Connection*) : LibC::Int
|
||||
|
@ -148,7 +149,7 @@ lib LibIPC
|
|||
|
||||
|
||||
# networkd-related functions
|
||||
fun ipc_wait_event_networkd(Connections*, Connection*, Event*, Switchings*) : LibC::Int
|
||||
fun ipc_wait_event_networkd(Connections*, Connection*, Event*, Switchings*, LibC::Long*) : LibC::Int
|
||||
|
||||
fun ipc_receive_fd (sock : LibC::Int, fd : LibC::Int*) : LibC::Int
|
||||
fun ipc_provide_fd (sock : LibC::Int, fd : LibC::Int) : LibC::Int
|
||||
|
|
|
@ -70,22 +70,29 @@ class IPC::SwitchingService < IPC::Service
|
|||
@switch.del fd
|
||||
end
|
||||
|
||||
def wait_event(server : IPC::Connection , &block) : Tuple(LibIPC::EventType, IPC::Message, IPC::Connection)
|
||||
def wait_event(server : IPC::Connection , &block) : Tuple(LibIPC::EventType, IPC::Message, IPC::Connection) | Tuple(LibIPC::EventType, Nil, Nil)
|
||||
event = LibIPC::Event.new
|
||||
|
||||
serverp = server.pointer
|
||||
r = LibIPC.ipc_wait_event_networkd self.pointer, serverp, pointerof(event), @switch.pointer
|
||||
r = LibIPC.ipc_wait_event_networkd self.pointer, serverp, pointerof(event), @switch.pointer, pointerof(@timer)
|
||||
|
||||
if r != 0
|
||||
m = String.new LibIPC.ipc_errors_get (r)
|
||||
yield IPC::Exception.new "error waiting for a new event: #{m}"
|
||||
end
|
||||
|
||||
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
||||
|
||||
# if event type is Timer, there is no connection nor message
|
||||
case eventtype
|
||||
when LibIPC::EventType::Timer
|
||||
return eventtype, nil, nil
|
||||
end
|
||||
|
||||
connection = IPC::Connection.new event.origin.unsafe_as(Pointer(LibIPC::Connection)).value
|
||||
|
||||
message = event.message.unsafe_as(Pointer(LibIPC::Message))
|
||||
|
||||
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
||||
|
||||
return eventtype, IPC::Message.new(message), connection
|
||||
end
|
||||
end
|
||||
|
|
Reference in New Issue