summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java')
-rw-r--r--libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java178
1 files changed, 127 insertions, 51 deletions
diff --git a/libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java b/libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java
index a32445c343b..a7bc0940ed0 100644
--- a/libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java
+++ b/libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java
@@ -8,7 +8,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-
+
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
@@ -49,70 +49,146 @@ import java.rmi.server.RMISocketFactory;
import java.util.Hashtable;
/**
- * I let DGCImpl to extend UnicastServerRef, but not
- * UnicastRemoteObject, because UnicastRemoteObject must
- * exportObject automatically.
- */
+ * The DGC implementation is used for the server side during the distributed
+ * garbage collection. This interface contains the two methods: dirty and clean.
+ * A dirty call is made when a remote reference is unmarshaled in a client. A
+ * corresponding clean call is made by client it no longer uses that remote
+ * reference. A reference to a remote object is also automatically released
+ * after so called lease period that starts after the dirty call is received. It
+ * is the client's responsibility to renew the leases, by making additional
+ * dirty calls before such leases expire.
+ */
public class DGCImpl
- extends UnicastServerRef implements DGC {
-
- private static final long LEASE_VALUE = 600000L;
- // leaseCache caches a LeaseRecord associated with a vmid
- private Hashtable leaseCache = new Hashtable();
-
-public DGCImpl() throws RemoteException {
- super(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory());
-}
-
-public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws RemoteException {
- VMID vmid = lease.getVMID();
- if (vmid == null)
- vmid = new VMID();
- long leaseValue = LEASE_VALUE;
- //long leaseValue = lease.getValue();
+ extends UnicastServerRef
+ implements DGC
+{
+ /*
+ * The DGCImpl extends UnicastServerRef and not UnicastRemoteObject, because
+ * UnicastRemoteObject must exportObject automatically.
+ */
+
+ /**
+ * This defauld lease value is used if the lease value, passed to the
+ * {@link #dirty} is equal to zero.
+ */
+ static final long LEASE_VALUE = 600000L;
+
+ // leaseCache caches a LeaseRecord associated with a vmid
+ Hashtable leaseCache = new Hashtable();
+
+ public DGCImpl() throws RemoteException
+ {
+ super(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory());
+ }
+
+ /**
+ * Mark the given objects referecnes as used on the client side.
+ *
+ * @param ids the ids of the used objects.
+ * @param sequenceNum the number of the call (used to detect and discard late
+ * calls).
+ * @param lease the requested lease
+ * @return the granted lease
+ */
+ public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease)
+ throws RemoteException
+ {
+ VMID vmid = lease.getVMID();
+ if (vmid == null)
+ vmid = new VMID();
+
+ long leaseValue = lease.getValue();
+ if (leaseValue <= 0)
+ leaseValue = LEASE_VALUE;
+
lease = new Lease(vmid, leaseValue);
- synchronized(leaseCache){
- LeaseRecord lr = (LeaseRecord)leaseCache.get(vmid);
- if (lr != null)
- lr.reset(leaseValue);
- else{
- lr = new LeaseRecord(vmid, leaseValue);
- leaseCache.put(vmid, lr);
- }
- }
-
- return (lease);
-}
-
-public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong) throws RemoteException {
- // Not implemented
-}
+ LeaseRecord lr = (LeaseRecord) leaseCache.get(vmid);
+ if (lr != null)
+ lr.reset(leaseValue);
+ else
+ {
+ lr = new LeaseRecord(vmid, leaseValue, ids);
+ leaseCache.put(vmid, lr);
+ }
+ return (lease);
+ }
+
+ /**
+ * Mark the given objects as no longer used on the client side.
+ *
+ * @param ids the ids of the objects that are no longer used.
+ * @param sequenceNum the number of the call (used to detect and discard late
+ * calls)
+ * @param vmid the VMID of the client.
+ * @param strong make the "strong" clean call.
+ */
+ public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong)
+ throws RemoteException
+ {
+ // Not implemented
+ // TODO implement
+ }
+
/**
* LeaseRecord associates a vmid to expireTime.
*/
- private static class LeaseRecord{
- private VMID vmid;
- private long expireTime;
+ static class LeaseRecord
+ {
+ /**
+ * The lease id.
+ */
+ final VMID vmid;
+
+ /**
+ * The lease expiration time.
+ */
+ long expireTime;
- LeaseRecord(VMID vmid, long leaseValue){
+ /**
+ * The array of ObjeID's that must be protected from being garbage
+ * collected.
+ */
+ final ObjID [] objects;
+
+ /**
+ * Create the new lease record.
+ *
+ * @param vmid lease id.
+ * @param leaseValue lease value
+ */
+ LeaseRecord(VMID vmid, long leaseValue, ObjID [] an_objects)
+ {
this.vmid = vmid;
reset(leaseValue);
+ objects = an_objects;
}
-
- // reset expireTime
- void reset(long leaseValue){
+
+ /**
+ * Prolong the expiration time till current time + passed value
+ *
+ * @param leaseValue the value after that (since the current moment)
+ * the lease should expire in the future.
+ */
+ void reset(long leaseValue)
+ {
long l = System.currentTimeMillis();
expireTime = l + leaseValue;
}
-
- boolean isExpired(){
+
+ /**
+ * Check if the lease has been expired.
+ *
+ * @return true if the lease has been expired, false if it is still valid.
+ */
+ boolean isExpired()
+ {
long l = System.currentTimeMillis();
- if ( l > expireTime)
- return true;
+ if (l > expireTime)
+ return true;
return false;
}
-
- } //End of LeaseRecord
-} //End of DGCImpl
+ } // End of LeaseRecord
+
+} // End of DGCImpl
OpenPOWER on IntegriCloud