wait_event simplification & send_now
parent
c7c0909f35
commit
8998c9adc8
|
@ -19,6 +19,10 @@ class IPC::Client < IPC::Context
|
||||||
at_exit { close }
|
at_exit { close }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def fd
|
||||||
|
@server_fd
|
||||||
|
end
|
||||||
|
|
||||||
def read
|
def read
|
||||||
unless (fd = @server_fd).nil?
|
unless (fd = @server_fd).nil?
|
||||||
message = LibIPC::Message.new
|
message = LibIPC::Message.new
|
||||||
|
|
|
@ -40,13 +40,13 @@ class IPC::Context
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def wait_event(&block) : IPC::Event::Events | Exception
|
def wait_event : IPC::Event::Events | Exception
|
||||||
event = LibIPC::Event.new
|
event = LibIPC::Event.new
|
||||||
|
|
||||||
r = LibIPC.ipc_wait_event self.pointer, pointerof(event), pointerof(@timer)
|
r = LibIPC.ipc_wait_event self.pointer, pointerof(event), pointerof(@timer)
|
||||||
if r.error_code != 0
|
if r.error_code != 0
|
||||||
m = String.new r.error_message.to_slice
|
m = String.new r.error_message.to_slice
|
||||||
yield IPC::Exception.new "error waiting for a new event: #{m}"
|
return IPC::Exception.new "error waiting for a new event: #{m}"
|
||||||
end
|
end
|
||||||
|
|
||||||
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
eventtype = event.type.unsafe_as(LibIPC::EventType)
|
||||||
|
@ -88,32 +88,55 @@ class IPC::Context
|
||||||
@timer = @base_timer
|
@timer = @base_timer
|
||||||
end
|
end
|
||||||
|
|
||||||
yield wait_event &block
|
break if yield wait_event
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def send_now(message : LibIPC::Message)
|
||||||
|
r = LibIPC.ipc_write_fd(message.fd, pointerof(message))
|
||||||
|
if r.error_code != 0
|
||||||
|
m = String.new r.error_message.to_slice
|
||||||
|
raise Exception.new "error writing a message: #{m}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_now(message : IPC::Message)
|
||||||
|
send_now fd: message.fd, utype: message.utype, payload: message.payload
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_now(fd : Int32, utype : UInt8, payload : Bytes)
|
||||||
|
message = LibIPC::Message.new fd: fd,
|
||||||
|
type: LibIPC::MessageType::Data.to_u8,
|
||||||
|
user_type: utype,
|
||||||
|
length: payload.bytesize,
|
||||||
|
payload: payload.to_unsafe
|
||||||
|
send_now message
|
||||||
|
end
|
||||||
|
|
||||||
|
def send(message : LibIPC::Message)
|
||||||
|
r = LibIPC.ipc_write(self.pointer, pointerof(message))
|
||||||
|
if r.error_code != 0
|
||||||
|
m = String.new r.error_message.to_slice
|
||||||
|
raise Exception.new "error writing a message: #{m}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def send(message : IPC::Message)
|
||||||
|
send fd: message.fd, utype: message.utype, payload: message.payload
|
||||||
|
end
|
||||||
|
|
||||||
def send(fd : Int32, utype : UInt8, payload : Bytes)
|
def send(fd : Int32, utype : UInt8, payload : Bytes)
|
||||||
message = LibIPC::Message.new fd: fd,
|
message = LibIPC::Message.new fd: fd,
|
||||||
type: LibIPC::MessageType::Data.to_u8,
|
type: LibIPC::MessageType::Data.to_u8,
|
||||||
user_type: utype,
|
user_type: utype,
|
||||||
length: payload.bytesize,
|
length: payload.bytesize,
|
||||||
payload: payload.to_unsafe
|
payload: payload.to_unsafe
|
||||||
|
send message
|
||||||
r = LibIPC.ipc_write(self.pointer, pointerof(message))
|
|
||||||
if r.error_code != 0
|
|
||||||
m = String.new r.error_message.to_slice
|
|
||||||
raise Exception.new "error writing a message: #{m}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def send(fd : Int32, utype : UInt8, payload : String)
|
def send(fd : Int32, utype : UInt8, payload : String)
|
||||||
send(fd, utype, Bytes.new(payload.to_unsafe, payload.bytesize))
|
send(fd, utype, Bytes.new(payload.to_unsafe, payload.bytesize))
|
||||||
end
|
end
|
||||||
|
|
||||||
def send(message : IPC::Message)
|
|
||||||
send(message.fd, message.utype, message.payload)
|
|
||||||
end
|
|
||||||
|
|
||||||
def read(index : UInt32)
|
def read(index : UInt32)
|
||||||
message = LibIPC::Message.new
|
message = LibIPC::Message.new
|
||||||
r = LibIPC.ipc_read(self.pointer, index, pointerof(message))
|
r = LibIPC.ipc_read(self.pointer, index, pointerof(message))
|
||||||
|
|
|
@ -118,6 +118,10 @@ lib LibIPC
|
||||||
# Sending a message (will wait the fd to become available for IO operations).
|
# Sending a message (will wait the fd to become available for IO operations).
|
||||||
fun ipc_write(Ctx*, Message*) : IPCError
|
fun ipc_write(Ctx*, Message*) : IPCError
|
||||||
|
|
||||||
|
# Sending a message NOW.
|
||||||
|
# WARNING: unbuffered send do not wait the fd to become available.
|
||||||
|
fun ipc_write_fd(Int32, Message*) : IPCError
|
||||||
|
|
||||||
# This function let the user get the default error message based on the error code.
|
# 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.
|
# 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*
|
fun ipc_errors_get (LibC::Int) : LibC::Char*
|
||||||
|
|
Reference in New Issue