home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.transport;
-
- import java.rmi.Remote;
- import java.rmi.dgc.VMID;
- import java.rmi.server.ExportException;
- import java.rmi.server.LogStream;
- import java.rmi.server.ObjID;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import sun.misc.Ref;
-
- public final class ObjectTable {
- private static Hashtable objTable = new Hashtable();
- private static Hashtable implTable = new Hashtable();
- private static Reaper reaper = null;
- private static Thread keepAlive = null;
-
- private ObjectTable() {
- }
-
- static Target getTarget(ObjID var0) {
- return (Target)objTable.get(var0);
- }
-
- public static Target getTarget(Remote var0) {
- return (Target)implTable.get(var0);
- }
-
- static synchronized void putTarget(ObjID var0, Target var1) throws ExportException {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("ObjectTable.putTarget: add object " + var0 + ", target = " + var1);
- }
-
- WeakRef var2 = var1.getWeakImpl();
- if (!objTable.containsKey(var0) && !implTable.containsKey(var2)) {
- objTable.put(var0, var1);
- implTable.put(var2, var1);
- if (reaper == null) {
- reaper = new Reaper();
- Thread var3 = RMIThread.newThread(reaper, "Reaper", true);
- var3.start();
- }
-
- if (keepAlive == null && !var1.isPermanent()) {
- keepAlive = RMIThread.newThread(new KeepAlive(), "KeepAlive", false);
- keepAlive.start();
- }
-
- } else {
- throw new ExportException("Object ID already in use");
- }
- }
-
- static synchronized void referenced(ObjID var0, long var1, VMID var3) {
- Target var4 = getTarget(var0);
- if (var4 != null) {
- var4.referenced(var1, var3);
- }
-
- }
-
- static synchronized void unreferenced(ObjID var0, long var1, VMID var3, boolean var4) {
- Target var5 = getTarget(var0);
- if (var5 != null) {
- var5.unreferenced(var1, var3, var4);
- }
-
- }
-
- static void reap() {
- Enumeration var0 = objTable.keys();
-
- while(var0.hasMoreElements()) {
- ObjID var1 = (ObjID)var0.nextElement();
- Target var2 = getTarget(var1);
- if (var2 != null) {
- WeakRef var3 = var2.getWeakImpl();
- if (((Ref)var3).get() == null) {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("ObjectTable.reap: remove object " + var1);
- }
-
- if (!var2.isEmpty()) {
- throw new Error("Reaping an object with references");
- }
-
- implTable.remove(var3);
- objTable.remove(var1);
- }
- }
- }
-
- checkKeepAlive();
- }
-
- private static synchronized void checkKeepAlive() {
- if (keepAlive != null) {
- Enumeration var0 = objTable.elements();
-
- while(var0.hasMoreElements()) {
- Target var1 = (Target)var0.nextElement();
- if (!var1.isPermanent()) {
- return;
- }
- }
-
- keepAlive.stop();
- keepAlive = null;
- }
-
- }
- }
-