Class: Mach::Port
Overview
Michael Weber’s “Some Fun with Mach Ports” was an indispensable resource in learning the Mach ports API.
Defined Under Namespace
Classes: ReceiveRightMsg, SendRightMsg
Instance Attribute Summary collapse
-
#ipc_space ⇒ Object
readonly
Returns the value of attribute ipc_space.
-
#port ⇒ Object
(also: #to_i)
readonly
Returns the value of attribute port.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#copy_send(remote_port) ⇒ Object
Copy the send right on this port and send it in a message to
remote_port. - #deallocate(opts = {}) ⇒ Object
- #destroy(opts = {}) ⇒ Object
-
#initialize(opts = {}) ⇒ Port
constructor
is wrapped in a new Port object; otherwise a new port is allocated according to the other options.
-
#insert_right(right, opts = {}) ⇒ Object
Insert
rightinto another ipc space. -
#receive_right ⇒ Object
Create a new Port by receiving a port right message on this port.
-
#send_right(right, remote_port) ⇒ Object
Send
righton this Port toremote_port. - #to_s ⇒ Object
Methods included from Functions
attach_mach_function, error_check, error_check_bootstrap, new_memory_pointer, #new_memory_pointer
Methods included from Types
Constructor Details
#initialize(opts = {}) ⇒ Port
is wrapped in a new Port object; otherwise a new port is allocated according to the other options
40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/mach/port.rb', line 40 def initialize(opts = {}) @ipc_space = opts[:ipc_space] || mach_task_self right = opts[:right] || :receive @port = if opts[:port] opts[:port].to_i else mem = new_memory_pointer(:mach_port_right_t) mach_port_allocate(@ipc_space.to_i, right, mem) mem.get_uint(0) end end |
Instance Attribute Details
#ipc_space ⇒ Object (readonly)
Returns the value of attribute ipc_space.
29 30 31 |
# File 'lib/mach/port.rb', line 29 def ipc_space @ipc_space end |
#port ⇒ Object (readonly) Also known as: to_i
Returns the value of attribute port.
29 30 31 |
# File 'lib/mach/port.rb', line 29 def port @port end |
Instance Method Details
#==(other) ⇒ Object
62 63 64 |
# File 'lib/mach/port.rb', line 62 def ==(other) (port == other.port) && (ipc_space == other.ipc_space) end |
#copy_send(remote_port) ⇒ Object
Copy the send right on this port and send it in a message to remote_port. The current task must have an existing send right on this Port.
123 124 125 |
# File 'lib/mach/port.rb', line 123 def copy_send(remote_port) send_right(:copy_send, remote_port) end |
#deallocate(opts = {}) ⇒ Object
71 72 73 74 |
# File 'lib/mach/port.rb', line 71 def deallocate(opts = {}) ipc_space = opts[:ipc_space] || @ipc_space mach_port_deallocate(ipc_space.to_i, @port) end |
#destroy(opts = {}) ⇒ Object
66 67 68 69 |
# File 'lib/mach/port.rb', line 66 def destroy(opts = {}) ipc_space = opts[:ipc_space] || @ipc_space mach_port_destroy(ipc_space, @port) end |
#insert_right(right, opts = {}) ⇒ Object
Insert right into another ipc space. The current task must have sufficient rights to insert the requested right.
right will be inserted; defaults to this port’s ipc_space
have in :ipc_space; defaults to the same name as this port
88 89 90 91 92 93 |
# File 'lib/mach/port.rb', line 88 def insert_right(right, opts = {}) ipc_space = opts[:ipc_space] || @ipc_space port_name = opts[:port_name] || @port mach_port_insert_right(ipc_space.to_i, port_name.to_i, @port, right) end |
#receive_right ⇒ Object
Create a new Port by receiving a port right message on this port.
129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/mach/port.rb', line 129 def receive_right msg = ReceiveRightMsg.new mach_msg(msg, 2, # RCV_MSG, 0, msg.size, port, MSG_TIMEOUT_NONE, PORT_NULL) self.class.new :port => msg[:port][:name] end |
#send_right(right, remote_port) ⇒ Object
Send right on this Port to remote_port. The current task must already have the requisite rights allowing it to send right.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/mach/port.rb', line 98 def send_right(right, remote_port) msg = SendRightMsg.new msg[:header].tap do |h| h[:remote_port] = remote_port.to_i h[:local_port] = PORT_NULL h[:bits] = (MsgType[right] | (0 << 8)) | 0x80000000 # MACH_MSGH_BITS_COMPLEX h[:size] = 40 # msg.size end msg[:body][:descriptor_count] = 1 msg[:port].tap do |p| p[:name] = port p[:disposition] = MsgType[right] p[:type] = 0 # MSG_PORT_DESCRIPTOR; end mach_msg_send msg end |
#to_s ⇒ Object
58 59 60 |
# File 'lib/mach/port.rb', line 58 def to_s "#<#{self.class} #{to_i}>" end |