1 // natSharedLibLoader.cc - Implementation of SharedLibHelper native methods.
3 /* Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
13 // If we're using the Boehm GC, then we need this include to override dlopen.
16 #endif /* HAVE_BOEHM_GC */
20 #include <execution.h>
22 #include <gnu/gcj/runtime/SharedLibHelper.h>
23 #include <java/io/IOException.h>
24 #include <java/lang/UnsupportedOperationException.h>
25 #include <java/lang/UnknownError.h>
30 /* Only used during dlopen, while having a lock on Class.class. */
31 static java::lang::ClassLoader *curLoader;
32 static gnu::gcj::runtime::SharedLibHelper *curHelper;
34 typedef void (*ClassHookFunc) (jclass);
35 typedef void (*CoreHookFunc) (_Jv_core_chain *);
38 _Jv_sharedlib_register_hook (jclass cls)
40 cls->protectionDomain = curHelper->domain;
41 cls->loader = curLoader;
42 cls->engine = &_Jv_soleCompiledEngine;
43 curHelper->registerClass(cls->getName(), cls);
47 core_hook (_Jv_core_chain *chain)
49 chain->next = (_Jv_core_chain *) curHelper->core_chain;
50 curHelper->core_chain = (gnu::gcj::RawData *) chain;
56 CoreHookFunc saved_core;
59 saved = _Jv_RegisterClassHook;
60 saved_core = _Jv_RegisterCoreHook;
64 _Jv_RegisterClassHook = saved;
65 _Jv_RegisterCoreHook = saved_core;
72 gnu::gcj::runtime::SharedLibHelper::init(void)
75 char *lname = (char *) __builtin_alloca (JvGetStringUTFLength (baseName)
77 jsize total = JvGetStringUTFRegion (baseName, 0, baseName->length(), lname);
81 flags = RTLD_GLOBAL | RTLD_LAZY;
82 JvSynchronize dummy1(&java::lang::Class::class$);
83 SharedLibDummy dummy2;
86 _Jv_RegisterClassHook = _Jv_sharedlib_register_hook;
87 _Jv_RegisterCoreHook = core_hook;
88 void *h = dlopen(lname, flags);
91 const char *msg = dlerror();
92 throw new java::lang::UnknownError(JvNewStringLatin1(msg));
94 handler = (gnu::gcj::RawData*) h;
97 = "shared library class loading is not supported on this platform";
98 throw new java::lang::UnsupportedOperationException(JvNewStringLatin1(msg));
103 gnu::gcj::runtime::SharedLibHelper::hasResource (jstring name)
106 _Jv_core_chain *node = _Jv_FindCore ((_Jv_core_chain *) core_chain, name);
114 gnu::gcj::runtime::SharedLibHelper::findCore (jstring name)
117 extern gnu::gcj::Core *_Jv_create_core (_Jv_core_chain *node, jstring name);
119 return _Jv_create_core ((_Jv_core_chain *) core_chain, name);
126 gnu::gcj::runtime::SharedLibHelper::finalize()
128 _Jv_FreeCoreChain ((_Jv_core_chain *) core_chain);
136 gnu::gcj::runtime::SharedLibHelper::ensureSupersLinked(jclass k)
138 _Jv_Linker::wait_for_state (k, JV_STATE_LOADING);