Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
	}
}
Ejemplo n.º 3
0
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);
}