Skip to content

Commit fade73d

Browse files
committed
macOS: Move more mach APIs behind types with stricter errors.
1 parent 4fa1815 commit fade73d

File tree

1 file changed

+43
-40
lines changed

1 file changed

+43
-40
lines changed

src/platform/macos/mod.rs

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// except according to those terms.
99

1010
use self::mach_sys::{kern_return_t, mach_msg_body_t, mach_msg_header_t, mach_msg_return_t};
11-
use self::mach_sys::{mach_msg_ool_descriptor_t, mach_msg_port_descriptor_t};
11+
use self::mach_sys::{mach_msg_ool_descriptor_t, mach_msg_port_descriptor_t, mach_msg_type_name_t};
1212
use self::mach_sys::{mach_msg_timeout_t, mach_port_limits_t, mach_port_msgcount_t};
1313
use self::mach_sys::{mach_port_right_t, mach_port_t, mach_task_self_, vm_inherit_t};
1414

@@ -134,7 +134,7 @@ impl Drop for OsIpcReceiver {
134134
}
135135
}
136136

137-
fn mach_port_allocate(right: mach_port_right_t) -> Result<mach_port_t, MachError> {
137+
fn mach_port_allocate(right: mach_port_right_t) -> Result<mach_port_t, KernelError> {
138138
let mut port: mach_port_t = 0;
139139
let os_result = unsafe {
140140
mach_sys::mach_port_allocate(mach_task_self(), right, &mut port)
@@ -165,6 +165,34 @@ fn mach_port_mod_release(port: mach_port_t, right: mach_port_right_t) -> Result<
165165
Err(err.into())
166166
}
167167

168+
fn mach_port_move_member(port: mach_port_t, set: mach_port_t) -> Result<(), KernelError> {
169+
let error = unsafe {
170+
mach_sys::mach_port_move_member(mach_task_self(), port, set)
171+
};
172+
if error == KERN_SUCCESS {
173+
return Ok(());
174+
}
175+
Err(error.into())
176+
}
177+
178+
fn mach_port_extract_right(
179+
port: mach_port_t,
180+
message_type: mach_msg_type_name_t
181+
) -> Result<(mach_port_t, mach_msg_type_name_t), KernelError> {
182+
let (mut right, mut acquired_right) = (0, 0);
183+
let error = unsafe {
184+
mach_sys::mach_port_extract_right(mach_task_self(),
185+
port,
186+
message_type,
187+
&mut right,
188+
&mut acquired_right)
189+
};
190+
if error == KERN_SUCCESS {
191+
return Ok((right, acquired_right));
192+
}
193+
Err(error.into())
194+
}
195+
168196
impl OsIpcReceiver {
169197
fn new() -> Result<OsIpcReceiver,MachError> {
170198
let port = try!(mach_port_allocate(MACH_PORT_RIGHT_RECEIVE));
@@ -181,7 +209,7 @@ impl OsIpcReceiver {
181209
if os_result == KERN_SUCCESS {
182210
Ok(OsIpcReceiver::from_name(port))
183211
} else {
184-
Err(MachError::from(os_result))
212+
Err(KernelError::from(os_result).into())
185213
}
186214
}
187215

@@ -210,20 +238,9 @@ impl OsIpcReceiver {
210238
fn sender(&self) -> Result<OsIpcSender,MachError> {
211239
let port = self.port.get();
212240
debug_assert!(port != MACH_PORT_NULL);
213-
unsafe {
214-
let (mut right, mut acquired_right) = (0, 0);
215-
let os_result = mach_sys::mach_port_extract_right(mach_task_self(),
216-
port,
217-
MACH_MSG_TYPE_MAKE_SEND as u32,
218-
&mut right,
219-
&mut acquired_right);
220-
if os_result == KERN_SUCCESS {
221-
debug_assert!(acquired_right == MACH_MSG_TYPE_PORT_SEND as u32);
222-
Ok(OsIpcSender::from_name(right))
223-
} else {
224-
Err(MachError::from(os_result))
225-
}
226-
}
241+
let (right, acquired_right) = mach_port_extract_right(port, MACH_MSG_TYPE_MAKE_SEND as u32)?;
242+
debug_assert!(acquired_right == MACH_MSG_TYPE_PORT_SEND as u32);
243+
Ok(OsIpcSender::from_name(right))
227244
}
228245

229246
fn register_bootstrap_name(&self) -> Result<String,MachError> {
@@ -235,20 +252,12 @@ impl OsIpcReceiver {
235252
TASK_BOOTSTRAP_PORT,
236253
&mut bootstrap_port);
237254
if os_result != KERN_SUCCESS {
238-
return Err(MachError::from(os_result))
255+
return Err(KernelError::from(os_result).into())
239256
}
240257

241258

242259
// FIXME(pcwalton): Does this leak?
243-
let (mut right, mut acquired_right) = (0, 0);
244-
let os_result = mach_sys::mach_port_extract_right(mach_task_self(),
245-
port,
246-
MACH_MSG_TYPE_MAKE_SEND as u32,
247-
&mut right,
248-
&mut acquired_right);
249-
if os_result != KERN_SUCCESS {
250-
return Err(MachError::from(os_result))
251-
}
260+
let (right, acquired_right) = mach_port_extract_right(port, MACH_MSG_TYPE_MAKE_SEND as u32)?;
252261
debug_assert!(acquired_right == MACH_MSG_TYPE_PORT_SEND as u32);
253262

254263
let mut os_result;
@@ -276,7 +285,7 @@ impl OsIpcReceiver {
276285
TASK_BOOTSTRAP_PORT,
277286
&mut bootstrap_port);
278287
if os_result != KERN_SUCCESS {
279-
return Err(MachError::from(os_result))
288+
return Err(KernelError::from(os_result).into())
280289
}
281290

282291
let c_name = CString::new(name).unwrap();
@@ -305,7 +314,7 @@ impl OsIpcReceiver {
305314
MACH_MSG_TYPE_MAKE_SEND_ONCE as u32,
306315
&mut 0);
307316
if os_result != KERN_SUCCESS {
308-
return Err(MachError::from(os_result))
317+
return Err(KernelError::from(os_result).into())
309318
}
310319
}
311320
Ok(())
@@ -391,7 +400,7 @@ impl OsIpcSender {
391400
TASK_BOOTSTRAP_PORT,
392401
&mut bootstrap_port);
393402
if os_result != KERN_SUCCESS {
394-
return Err(MachError::from(os_result))
403+
return Err(KernelError::from(os_result).into())
395404
}
396405

397406
let mut port = 0;
@@ -542,16 +551,10 @@ impl OsIpcReceiverSet {
542551
}
543552

544553
pub fn add(&mut self, receiver: OsIpcReceiver) -> Result<u64,MachError> {
545-
let os_result = unsafe {
546-
mach_sys::mach_port_move_member(mach_task_self(), receiver.extract_port(), self.port.get())
547-
};
548-
if os_result == KERN_SUCCESS {
549-
let receiver_port = receiver.consume_port();
550-
self.ports.push(receiver_port);
551-
Ok(receiver_port as u64)
552-
} else {
553-
Err(MachError::from(os_result))
554-
}
554+
mach_port_move_member(receiver.extract_port(), self.port.get())?;
555+
let receiver_port = receiver.consume_port();
556+
self.ports.push(receiver_port);
557+
Ok(receiver_port as u64)
555558
}
556559

557560
pub fn select(&mut self) -> Result<Vec<OsIpcSelectionResult>,MachError> {

0 commit comments

Comments
 (0)