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
15 #include <execution.h>
17 #include <gnu/gcj/runtime/SharedLibHelper.h>
18 #include <java/io/IOException.h>
19 #include <java/lang/UnsupportedOperationException.h>
20 #include <java/lang/UnknownError.h>
25 /* Only used during dlopen, while having a lock on Class.class. */
26 static java::lang::ClassLoader
*curLoader
;
27 static gnu::gcj::runtime::SharedLibHelper
*curHelper
;
29 typedef void (*ClassHookFunc
) (jclass
);
30 typedef void (*CoreHookFunc
) (_Jv_core_chain
*);
33 _Jv_sharedlib_register_hook (jclass cls
)
35 cls
->protectionDomain
= curHelper
->domain
;
36 cls
->loader
= curLoader
;
37 cls
->engine
= &_Jv_soleCompiledEngine
;
38 curHelper
->registerClass(cls
->getName(), cls
);
42 core_hook (_Jv_core_chain
*chain
)
44 chain
->next
= (_Jv_core_chain
*) curHelper
->core_chain
;
45 curHelper
->core_chain
= (gnu::gcj::RawData
*) chain
;
51 CoreHookFunc saved_core
;
54 saved
= _Jv_RegisterClassHook
;
55 saved_core
= _Jv_RegisterCoreHook
;
59 _Jv_RegisterClassHook
= saved
;
60 _Jv_RegisterCoreHook
= saved_core
;
67 gnu::gcj::runtime::SharedLibHelper::init(void)
70 char *lname
= (char *) __builtin_alloca (JvGetStringUTFLength (baseName
)
72 jsize total
= JvGetStringUTFRegion (baseName
, 0, baseName
->length(), lname
);
76 flags
= RTLD_GLOBAL
| RTLD_LAZY
;
77 JvSynchronize
dummy1(&java::lang::Class::class$
);
78 SharedLibDummy dummy2
;
81 _Jv_RegisterClassHook
= _Jv_sharedlib_register_hook
;
82 _Jv_RegisterCoreHook
= core_hook
;
83 void *h
= dlopen(lname
, flags
);
86 const char *msg
= dlerror();
87 throw new java::lang::UnknownError(JvNewStringLatin1(msg
));
89 handler
= (gnu::gcj::RawData
*) h
;
92 = "shared library class loading is not supported on this platform";
93 throw new java::lang::UnsupportedOperationException(JvNewStringLatin1(msg
));
98 gnu::gcj::runtime::SharedLibHelper::hasResource (jstring name
)
101 _Jv_core_chain
*node
= _Jv_FindCore ((_Jv_core_chain
*) core_chain
, name
);
109 gnu::gcj::runtime::SharedLibHelper::findCore (jstring name
)
112 extern gnu::gcj::Core
*_Jv_create_core (_Jv_core_chain
*node
, jstring name
);
114 return _Jv_create_core ((_Jv_core_chain
*) core_chain
, name
);
121 gnu::gcj::runtime::SharedLibHelper::finalize()
123 _Jv_FreeCoreChain ((_Jv_core_chain
*) core_chain
);
131 gnu::gcj::runtime::SharedLibHelper::ensureSupersLinked(jclass k
)
133 _Jv_Linker::wait_for_state (k
, JV_STATE_LOADING
);