SharedLibHelper.java [plain text]
package gnu.gcj.runtime;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.security.*;
import gnu.gcj.Core;
public class SharedLibHelper
{
SharedLibHelper(String libname, ClassLoader parent, CodeSource source,
int flags)
{
loader = parent;
baseName = libname;
domain = new ProtectionDomain(source,
Policy.getPolicy().getPermissions(source));
this.flags = flags;
}
public static SharedLibHelper findHelper (String libname)
{
synchronized (map)
{
WeakReference ref = (WeakReference) map.get(libname);
if (ref != null)
return (SharedLibHelper) ref.get();
return null;
}
}
public static SharedLibHelper findHelper (ClassLoader loader, String libname,
CodeSource source)
{
synchronized (map)
{
SharedLibHelper result;
WeakReference ref = (WeakReference) map.get(libname);
if (ref != null)
{
result = (SharedLibHelper) ref.get();
if (result != null)
{
if (result.loader != loader)
throw new UnknownError();
return result;
}
}
result = new SharedLibHelper(libname, loader, source, 0);
map.put(libname, new WeakReference(result));
return result;
}
}
public native void finalize ();
public Class findClass(String name)
{
ensureInit();
return (Class) classMap.get(name);
}
public URL findResource (String name)
{
ensureInit();
if (! hasResource(name))
return null;
try
{
return new URL("gcjlib", "", -1, baseName + "!/" + name);
}
catch (MalformedURLException _)
{
}
return null;
}
public native Core findCore (String name);
void ensureInit()
{
synchronized (classMap)
{
if (initialized)
return;
init();
initialized = true;
}
}
native boolean hasResource(String name);
native void init();
void registerClass(String name, Class cls)
{
classMap.put(name, cls);
}
gnu.gcj.RawData handler;
gnu.gcj.RawData core_chain;
HashMap classMap = new HashMap(20);
ClassLoader loader;
String baseName;
ProtectionDomain domain;
int flags;
boolean initialized = false;
static HashMap map = new HashMap ();
}