diff options
Diffstat (limited to 'libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java')
| -rw-r--r-- | libjava/classpath/gnu/java/rmi/dgc/DGCImpl.java | 178 |
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 |

