home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / rmi / transport / DGCClient.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  6.1 KB  |  273 lines

  1. package sun.rmi.transport;
  2.  
  3. import java.rmi.ConnectException;
  4. import java.rmi.RemoteException;
  5. import java.rmi.dgc.DGC;
  6. import java.rmi.dgc.Lease;
  7. import java.rmi.dgc.VMID;
  8. import java.rmi.server.LogStream;
  9. import java.rmi.server.ObjID;
  10. import java.util.Enumeration;
  11. import java.util.Hashtable;
  12. import java.util.NoSuchElementException;
  13. import java.util.Vector;
  14.  
  15. final class DGCClient implements Runnable {
  16.    private static final long leaseValue = Utils.getLong("java.rmi.dgc.leaseValue", 600000L);
  17.    static final long leaseRenewInterval = Utils.getLong("sun.rmi.dgc.renewInterval", 480000L);
  18.    private static Hashtable countTable = new Hashtable();
  19.    private static Hashtable refTable = new Hashtable();
  20.    private static Vector cleanList = new Vector();
  21.    private static Vector unrefList = new Vector();
  22.    private static VMID vmid;
  23.    private static long nextSequenceNum;
  24.    private static Thread cleaner;
  25.    private static Thread leasee;
  26.  
  27.    private DGCClient() {
  28.    }
  29.  
  30.    static void referenced(LiveRef var0) throws RemoteException {
  31.       Hashtable var1 = countTable;
  32.       synchronized(var1){}
  33.  
  34.       try {
  35.          RefCount var3 = (RefCount)countTable.get(var0);
  36.          if (var3 == null) {
  37.             LiveRef var4 = var0.copy();
  38.             ObjID var5 = var4.getObjID();
  39.             Endpoint var6 = var4.getEndpoint();
  40.             if (DGCImpl.logLevel >= 20) {
  41.                LogStream.log("dgc").println("DGCClient.referenced: add ref " + var5);
  42.             }
  43.  
  44.             var3 = new RefCount();
  45.             countTable.put(var4, var3);
  46.             RefList var7 = (RefList)refTable.get(var6);
  47.             if (var7 == null) {
  48.                var7 = new RefList(var6);
  49.                refTable.put(var6, var7);
  50.                if (leasee == null) {
  51.                   leasee = RMIThread.newThread(new LeaseRenewer(), "LeaseRenewer", true);
  52.                   leasee.start();
  53.                }
  54.  
  55.                if (cleaner == null) {
  56.                   cleaner = RMIThread.newThread(new DGCClient(), "Cleaner", true);
  57.                   cleaner.start();
  58.                }
  59.             }
  60.  
  61.             var7.ids.addElement(var5);
  62.             DGC var8 = LocateDGC.getDGC(var6);
  63.  
  64.             try {
  65.                if (DGCImpl.logLevel >= 20) {
  66.                   LogStream.log("dgc").println("DGCClient.referenced: making dirty call...");
  67.                }
  68.  
  69.                ObjID[] var9 = new ObjID[]{var5};
  70.                Lease var10 = var8.dirty(var9, getNextSequenceNum(), new Lease(vmid, leaseValue));
  71.                vmid = var10.getVMID();
  72.             } catch (RemoteException var13) {
  73.                if (DGCImpl.logLevel >= 10) {
  74.                   LogStream.log("dgc").println("DGCClient.referenced: dirty call failed");
  75.                }
  76.  
  77.                scheduleClean(var4, true);
  78.                throw var13;
  79.             }
  80.          }
  81.  
  82.          var0.counted();
  83.          ++var3.count;
  84.       } catch (Throwable var14) {
  85.          throw var14;
  86.       }
  87.  
  88.    }
  89.  
  90.    static void unreferenced(LiveRef var0) {
  91.       Vector var1 = unrefList;
  92.       synchronized(var1){}
  93.  
  94.       try {
  95.          unrefList.addElement(var0);
  96.          unrefList.notifyAll();
  97.       } catch (Throwable var3) {
  98.          throw var3;
  99.       }
  100.  
  101.    }
  102.  
  103.    private static synchronized long getNextSequenceNum() {
  104.       return (long)(nextSequenceNum++);
  105.    }
  106.  
  107.    private static void handleDecrements() {
  108.       while(!unrefList.isEmpty()) {
  109.          Vector var1 = unrefList;
  110.          synchronized(var1){}
  111.  
  112.          LiveRef var0;
  113.          try {
  114.             var0 = (LiveRef)unrefList.lastElement();
  115.             unrefList.removeElementAt(unrefList.size() - 1);
  116.          } catch (Throwable var10) {
  117.             throw var10;
  118.          }
  119.  
  120.          Hashtable var12 = countTable;
  121.          synchronized(var12){}
  122.  
  123.          try {
  124.             RefCount var3 = (RefCount)countTable.get(var0);
  125.             if (var3 != null) {
  126.                Endpoint var4 = var0.getEndpoint();
  127.                RefList var5 = (RefList)refTable.get(var4);
  128.                if (var5 != null) {
  129.                   var5.ids.removeElement(var0.getObjID());
  130.                   if (var5.ids.isEmpty()) {
  131.                      refTable.remove(var4);
  132.                   }
  133.                }
  134.  
  135.                if (--var3.count == 0) {
  136.                   if (DGCImpl.logLevel >= 20) {
  137.                      LogStream.log("dgc").println("DGCClient.unreferenced: " + var0.getObjID());
  138.                   }
  139.  
  140.                   scheduleClean(var0, false);
  141.                }
  142.             }
  143.          } catch (Throwable var11) {
  144.             throw var11;
  145.          }
  146.       }
  147.  
  148.    }
  149.  
  150.    private static void scheduleClean(LiveRef var0, boolean var1) {
  151.       cleanList.addElement(new CleanRequest(var0, getNextSequenceNum(), var1));
  152.       countTable.remove(var0);
  153.    }
  154.  
  155.    private static void sendCleans() {
  156.       Enumeration var0 = cleanList.elements();
  157.  
  158.       try {
  159.          while(var0.hasMoreElements()) {
  160.             CleanRequest var2 = (CleanRequest)var0.nextElement();
  161.  
  162.             DGC var1;
  163.             try {
  164.                var1 = LocateDGC.getDGC(var2.ref.getEndpoint());
  165.             } catch (RemoteException var6) {
  166.                continue;
  167.             }
  168.  
  169.             try {
  170.                if (vmid != null) {
  171.                   if (DGCImpl.logLevel >= 20) {
  172.                      LogStream.log("dgc").println("DGCClient.sendCleans: making clean call: " + var2.ref.getObjID());
  173.                   }
  174.  
  175.                   ObjID[] var3 = new ObjID[]{var2.ref.getObjID()};
  176.                   var1.clean(var3, var2.sequenceNum, vmid, var2.strong);
  177.                }
  178.  
  179.                cleanList.removeElement(var2);
  180.             } catch (ConnectException var4) {
  181.                cleanList.removeElement(var2);
  182.             } catch (RemoteException var5) {
  183.                if (DGCImpl.logLevel >= 20) {
  184.                   LogStream.log("dgc").println("DGCClient.sendCleans: clean call failed");
  185.                }
  186.             }
  187.          }
  188.  
  189.       } catch (NoSuchElementException var7) {
  190.       }
  191.    }
  192.  
  193.    public void run() {
  194.       while(true) {
  195.          long var1 = Utils.getLong("sun.rmi.transport.cleanInterval", 180000L);
  196.          System.runFinalization();
  197.          Vector var3 = unrefList;
  198.          synchronized(var3){}
  199.  
  200.          try {
  201.             if (unrefList.isEmpty()) {
  202.                try {
  203.                   unrefList.wait(var1);
  204.                } catch (InterruptedException var6) {
  205.                }
  206.             }
  207.          } catch (Throwable var7) {
  208.             throw var7;
  209.          }
  210.  
  211.          handleDecrements();
  212.          sendCleans();
  213.       }
  214.    }
  215.  
  216.    static boolean renewLeases() {
  217.       Hashtable var1 = countTable;
  218.       boolean var0;
  219.       synchronized(var1) {
  220.          Enumeration var3 = refTable.elements();
  221.  
  222.          while(var3.hasMoreElements()) {
  223.             RefList var4 = (RefList)var3.nextElement();
  224.  
  225.             try {
  226.                DGC var5 = LocateDGC.getDGC(var4.ep);
  227.                Vector var7 = var4.ids;
  228.                synchronized(var7){}
  229.  
  230.                ObjID[] var6;
  231.                try {
  232.                   var6 = new ObjID[var4.ids.size()];
  233.                   var4.ids.copyInto(var6);
  234.                } catch (Throwable var11) {
  235.                   throw var11;
  236.                }
  237.  
  238.                if (DGCImpl.logLevel >= 10) {
  239.                   LogStream.log("dgc").println("DGCClient.renewLeases: renew " + var4.ep);
  240.                }
  241.  
  242.                Lease var15 = var5.dirty(var6, getNextSequenceNum(), new Lease(vmid, leaseValue));
  243.                vmid = var15.getVMID();
  244.             } catch (RemoteException var12) {
  245.                refTable.remove(var4.ep);
  246.             }
  247.          }
  248.  
  249.          if (!refTable.isEmpty()) {
  250.             var0 = true;
  251.             return var0;
  252.          }
  253.  
  254.          leasee = null;
  255.          var0 = false;
  256.       }
  257.  
  258.       return var0;
  259.    }
  260.  
  261.    static {
  262.       if (VMID.isUnique()) {
  263.          vmid = new VMID();
  264.       } else {
  265.          vmid = null;
  266.       }
  267.  
  268.       nextSequenceNum = Long.MIN_VALUE;
  269.       cleaner = null;
  270.       leasee = null;
  271.    }
  272. }
  273.