예제 #1
0
_jc_env	*
_jc_support_init()
{
	_jc_mutex_init(&phoney_env, &phoney_loader.mutex);
	_jc_mutex_init(&phoney_env, &phoney_jvm.mutex);
	_jc_uni_alloc_init(&phoney_loader.uni, 0, NULL);
	phoney_jvm.boot.loader = &phoney_loader;
	phoney_env.vm = &phoney_jvm;
	return &phoney_env;
}
예제 #2
0
/*
 * Allocate and link a new classloader structure into a VM.
 *
 * An exception is stored if unsuccessful.
 *
 * NOTE: The global VM mutex must be held when calling this function.
 */
_jc_class_loader *
_jc_create_loader(_jc_env *env)
{
	_jc_jvm *const vm = env->vm;
	_jc_class_loader *loader;

	/* Sanity check */
	_JC_MUTEX_ASSERT(env, vm->mutex);

	/* Create and initialize new structure */
	if ((loader = _jc_vm_zalloc(env, sizeof(*loader)
	    + vm->object_path_len * sizeof(*loader->objects_loaded))) == NULL)
		return NULL;
	loader->objects_loaded = (jboolean *)(loader + 1);

	/* Initialize class loader memory manager */
	_jc_uni_alloc_init(&loader->uni, _JC_CL_ALLOC_MIN_PAGES,
	    &vm->avail_loader_pages);

	/* Initialize mutex and condition variable */
	if (_jc_mutex_init(env, &loader->mutex) != JNI_OK)
		goto fail1;
	if (_jc_cond_init(env, &loader->cond) != JNI_OK)
		goto fail2;

	/* Initialize initiated, defining, and partially derived type trees */
	_jc_splay_init(&loader->initiated_types,
	    _jc_node_cmp, _JC_OFFSETOF(_jc_type_node, node));
	_jc_splay_init(&loader->deriving_types,
	    _jc_node_cmp, _JC_OFFSETOF(_jc_type_node, node));
	_jc_splay_init(&loader->defined_types,
	    _jc_type_cmp, _JC_OFFSETOF(_jc_type, node));

	/* Initialize native library list */
	STAILQ_INIT(&loader->native_libs);

	/* Link new class loader into the VM */
	LIST_INSERT_HEAD(&vm->class_loaders, loader, link);

	/* Done */
	return loader;

	/* Clean up after failure */
fail2:	_jc_mutex_destroy(&loader->mutex);
fail1:	_jc_uni_alloc_free(&loader->uni);
	_jc_vm_free(&loader);
	return NULL;
}