Imported GNU Classpath 0.90

Imported GNU Classpath 0.90
       * scripts/makemake.tcl: Set gnu/java/awt/peer/swing to ignore.
       * gnu/classpath/jdwp/VMFrame.java (SIZE): New constant.
       * java/lang/VMCompiler.java: Use gnu.java.security.hash.MD5.
       * java/lang/Math.java: New override file.
       * java/lang/Character.java: Merged from Classpath.
       (start, end): Now 'int's.
       (canonicalName): New field.
       (CANONICAL_NAME, NO_SPACES_NAME, CONSTANT_NAME): New constants.
       (UnicodeBlock): Added argument.
       (of): New overload.
       (forName): New method.
       Updated unicode blocks.
       (sets): Updated.
       * sources.am: Regenerated.
       * Makefile.in: Likewise.

From-SVN: r111942
This commit is contained in:
Mark Wielaard
2006-03-10 21:46:48 +00:00
parent 27079765d0
commit 8aa540d2f7
1367 changed files with 188789 additions and 22762 deletions
+124 -48
View File
@@ -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 {
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;
private static final long LEASE_VALUE = 600000L;
// leaseCache caches a LeaseRecord associated with a vmid
private Hashtable leaseCache = new Hashtable();
// 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());
}
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;
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();
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