boolean_t ipc_hash_lookup( ipc_space_t space, ipc_object_t obj, mach_port_name_t *namep, ipc_entry_t *entryp) { boolean_t rv; rv = ipc_hash_local_lookup(space, obj, namep, entryp); if (!rv) { assert(!is_fast_space(space) || space->is_tree_hash == 0); if (space->is_tree_hash > 0) rv = ipc_hash_global_lookup(space, obj, namep, (ipc_tree_entry_t *) entryp); } return (rv); }
void ipc_hash_delete( ipc_space_t space, ipc_object_t obj, mach_port_name_t name, ipc_entry_t entry) { mach_port_index_t index; index = MACH_PORT_INDEX(name); if ((index < space->is_table_size) && (entry == &space->is_table[index])) ipc_hash_local_delete(space, obj, index, entry); else { assert(!is_fast_space(space)); ipc_hash_global_delete(space, obj, name, (ipc_tree_entry_t) entry); } }
kern_return_t mach_port_allocate_full( ipc_space_t space, mach_port_right_t right, mach_port_t proto, mach_port_qos_t *qosp, mach_port_name_t *namep) { ipc_kmsg_t kmsg; kern_return_t kr; if (space == IS_NULL) return (KERN_INVALID_TASK); if (proto != MACH_PORT_NULL) return (KERN_INVALID_VALUE); if (qosp->name) { if (!MACH_PORT_VALID (*namep)) return (KERN_INVALID_VALUE); if (is_fast_space (space)) return (KERN_FAILURE); } if (qosp->prealloc) { mach_msg_size_t size = qosp->len + MAX_TRAILER_SIZE; if (right != MACH_PORT_RIGHT_RECEIVE) return (KERN_INVALID_VALUE); kmsg = (ipc_kmsg_t)kalloc(ikm_plus_overhead(size)); if (kmsg == IKM_NULL) return (KERN_RESOURCE_SHORTAGE); ikm_init(kmsg, size); } switch (right) { case MACH_PORT_RIGHT_RECEIVE: { ipc_port_t port; if (qosp->name) kr = ipc_port_alloc_name(space, *namep, &port); else kr = ipc_port_alloc(space, namep, &port); if (kr == KERN_SUCCESS) { if (qosp->prealloc) ipc_kmsg_set_prealloc(kmsg, port); ip_unlock(port); } else if (qosp->prealloc) ipc_kmsg_free(kmsg); break; } case MACH_PORT_RIGHT_PORT_SET: { ipc_pset_t pset; if (qosp->name) kr = ipc_pset_alloc_name(space, *namep, &pset); else kr = ipc_pset_alloc(space, namep, &pset); if (kr == KERN_SUCCESS) ips_unlock(pset); break; } case MACH_PORT_RIGHT_DEAD_NAME: kr = ipc_object_alloc_dead(space, namep); break; default: kr = KERN_INVALID_VALUE; break; } return (kr); }