_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; }
/* * 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; }