home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.transport;
-
- import java.rmi.ConnectException;
- import java.rmi.RemoteException;
- import java.rmi.dgc.DGC;
- import java.rmi.dgc.Lease;
- import java.rmi.dgc.VMID;
- import java.rmi.server.LogStream;
- import java.rmi.server.ObjID;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.NoSuchElementException;
- import java.util.Vector;
-
- final class DGCClient implements Runnable {
- private static final long leaseValue = Utils.getLong("java.rmi.dgc.leaseValue", 600000L);
- static final long leaseRenewInterval = Utils.getLong("sun.rmi.dgc.renewInterval", 480000L);
- private static Hashtable countTable = new Hashtable();
- private static Hashtable refTable = new Hashtable();
- private static Vector cleanList = new Vector();
- private static Vector unrefList = new Vector();
- private static VMID vmid;
- private static long nextSequenceNum;
- private static Thread cleaner;
- private static Thread leasee;
-
- private DGCClient() {
- }
-
- static void referenced(LiveRef var0) throws RemoteException {
- Hashtable var1 = countTable;
- synchronized(var1){}
-
- try {
- RefCount var3 = (RefCount)countTable.get(var0);
- if (var3 == null) {
- LiveRef var4 = var0.copy();
- ObjID var5 = var4.getObjID();
- Endpoint var6 = var4.getEndpoint();
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("DGCClient.referenced: add ref " + var5);
- }
-
- var3 = new RefCount();
- countTable.put(var4, var3);
- RefList var7 = (RefList)refTable.get(var6);
- if (var7 == null) {
- var7 = new RefList(var6);
- refTable.put(var6, var7);
- if (leasee == null) {
- leasee = RMIThread.newThread(new LeaseRenewer(), "LeaseRenewer", true);
- leasee.start();
- }
-
- if (cleaner == null) {
- cleaner = RMIThread.newThread(new DGCClient(), "Cleaner", true);
- cleaner.start();
- }
- }
-
- var7.ids.addElement(var5);
- DGC var8 = LocateDGC.getDGC(var6);
-
- try {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("DGCClient.referenced: making dirty call...");
- }
-
- ObjID[] var9 = new ObjID[]{var5};
- Lease var10 = var8.dirty(var9, getNextSequenceNum(), new Lease(vmid, leaseValue));
- vmid = var10.getVMID();
- } catch (RemoteException var13) {
- if (DGCImpl.logLevel >= 10) {
- LogStream.log("dgc").println("DGCClient.referenced: dirty call failed");
- }
-
- scheduleClean(var4, true);
- throw var13;
- }
- }
-
- var0.counted();
- ++var3.count;
- } catch (Throwable var14) {
- throw var14;
- }
-
- }
-
- static void unreferenced(LiveRef var0) {
- Vector var1 = unrefList;
- synchronized(var1){}
-
- try {
- unrefList.addElement(var0);
- unrefList.notifyAll();
- } catch (Throwable var3) {
- throw var3;
- }
-
- }
-
- private static synchronized long getNextSequenceNum() {
- return (long)(nextSequenceNum++);
- }
-
- private static void handleDecrements() {
- while(!unrefList.isEmpty()) {
- Vector var1 = unrefList;
- synchronized(var1){}
-
- LiveRef var0;
- try {
- var0 = (LiveRef)unrefList.lastElement();
- unrefList.removeElementAt(unrefList.size() - 1);
- } catch (Throwable var10) {
- throw var10;
- }
-
- Hashtable var12 = countTable;
- synchronized(var12){}
-
- try {
- RefCount var3 = (RefCount)countTable.get(var0);
- if (var3 != null) {
- Endpoint var4 = var0.getEndpoint();
- RefList var5 = (RefList)refTable.get(var4);
- if (var5 != null) {
- var5.ids.removeElement(var0.getObjID());
- if (var5.ids.isEmpty()) {
- refTable.remove(var4);
- }
- }
-
- if (--var3.count == 0) {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("DGCClient.unreferenced: " + var0.getObjID());
- }
-
- scheduleClean(var0, false);
- }
- }
- } catch (Throwable var11) {
- throw var11;
- }
- }
-
- }
-
- private static void scheduleClean(LiveRef var0, boolean var1) {
- cleanList.addElement(new CleanRequest(var0, getNextSequenceNum(), var1));
- countTable.remove(var0);
- }
-
- private static void sendCleans() {
- Enumeration var0 = cleanList.elements();
-
- try {
- while(var0.hasMoreElements()) {
- CleanRequest var2 = (CleanRequest)var0.nextElement();
-
- DGC var1;
- try {
- var1 = LocateDGC.getDGC(var2.ref.getEndpoint());
- } catch (RemoteException var6) {
- continue;
- }
-
- try {
- if (vmid != null) {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("DGCClient.sendCleans: making clean call: " + var2.ref.getObjID());
- }
-
- ObjID[] var3 = new ObjID[]{var2.ref.getObjID()};
- var1.clean(var3, var2.sequenceNum, vmid, var2.strong);
- }
-
- cleanList.removeElement(var2);
- } catch (ConnectException var4) {
- cleanList.removeElement(var2);
- } catch (RemoteException var5) {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("DGCClient.sendCleans: clean call failed");
- }
- }
- }
-
- } catch (NoSuchElementException var7) {
- }
- }
-
- public void run() {
- while(true) {
- long var1 = Utils.getLong("sun.rmi.transport.cleanInterval", 180000L);
- System.runFinalization();
- Vector var3 = unrefList;
- synchronized(var3){}
-
- try {
- if (unrefList.isEmpty()) {
- try {
- unrefList.wait(var1);
- } catch (InterruptedException var6) {
- }
- }
- } catch (Throwable var7) {
- throw var7;
- }
-
- handleDecrements();
- sendCleans();
- }
- }
-
- static boolean renewLeases() {
- Hashtable var1 = countTable;
- boolean var0;
- synchronized(var1) {
- Enumeration var3 = refTable.elements();
-
- while(var3.hasMoreElements()) {
- RefList var4 = (RefList)var3.nextElement();
-
- try {
- DGC var5 = LocateDGC.getDGC(var4.ep);
- Vector var7 = var4.ids;
- synchronized(var7){}
-
- ObjID[] var6;
- try {
- var6 = new ObjID[var4.ids.size()];
- var4.ids.copyInto(var6);
- } catch (Throwable var11) {
- throw var11;
- }
-
- if (DGCImpl.logLevel >= 10) {
- LogStream.log("dgc").println("DGCClient.renewLeases: renew " + var4.ep);
- }
-
- Lease var15 = var5.dirty(var6, getNextSequenceNum(), new Lease(vmid, leaseValue));
- vmid = var15.getVMID();
- } catch (RemoteException var12) {
- refTable.remove(var4.ep);
- }
- }
-
- if (!refTable.isEmpty()) {
- var0 = true;
- return var0;
- }
-
- leasee = null;
- var0 = false;
- }
-
- return var0;
- }
-
- static {
- if (VMID.isUnique()) {
- vmid = new VMID();
- } else {
- vmid = null;
- }
-
- nextSequenceNum = Long.MIN_VALUE;
- cleaner = null;
- leasee = null;
- }
- }
-