home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.transport;
-
- import java.rmi.Remote;
- import java.rmi.dgc.VMID;
- import java.rmi.server.LogStream;
- import java.rmi.server.RemoteStub;
- import java.rmi.server.Unreferenced;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.rmi.server.Dispatcher;
-
- public final class Target {
- private boolean permanent = false;
- private WeakRef weakImpl;
- private Dispatcher disp;
- private RemoteStub stub;
- private Vector refSet = new Vector();
- private Hashtable sequenceTable = new Hashtable(5);
-
- public Target(Remote var1, Dispatcher var2, RemoteStub var3) {
- this.weakImpl = new WeakRef(var1);
- this.disp = var2;
- this.stub = var3;
- }
-
- public RemoteStub getStub() {
- return this.stub;
- }
-
- WeakRef getWeakImpl() {
- return this.weakImpl;
- }
-
- Dispatcher getDispatcher() {
- return this.disp;
- }
-
- synchronized Remote getImpl() {
- return (Remote)this.weakImpl.get();
- }
-
- boolean isPermanent() {
- return this.permanent;
- }
-
- synchronized void pinImpl() {
- this.weakImpl.pin();
- }
-
- synchronized void unpinImpl() {
- if (!this.permanent && this.refSet.isEmpty()) {
- this.weakImpl.unpin();
- }
-
- }
-
- public synchronized void setPermanent(boolean var1) {
- this.permanent = var1;
- if (this.permanent) {
- this.pinImpl();
- } else {
- this.unpinImpl();
- }
- }
-
- synchronized void referenced(long var1, VMID var3) {
- SequenceEntry var4 = (SequenceEntry)this.sequenceTable.get(var3);
- if (var4 == null) {
- this.sequenceTable.put(var3, new SequenceEntry(var1));
- } else {
- if (var4.sequenceNum >= var1) {
- return;
- }
-
- var4.update(var1);
- }
-
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("Target.referenced: add to dirty set: " + var3);
- }
-
- if (!this.refSet.contains(var3)) {
- this.refSet.addElement(var3);
- DGCImpl.getDGCImpl().registerTarget(var3, this);
- }
- }
-
- synchronized void unreferenced(long var1, VMID var3, boolean var4) {
- SequenceEntry var5 = (SequenceEntry)this.sequenceTable.get(var3);
- if (var5 != null && var5.sequenceNum <= var1) {
- if (var4) {
- var5.retain(var1);
- } else if (!var5.keep) {
- this.sequenceTable.remove(var3);
- }
-
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("Target.unreferenced: remove from dirty set: " + var3);
- }
-
- this.refSetRemove(var3);
- }
- }
-
- private synchronized void refSetRemove(VMID var1) {
- DGCImpl.getDGCImpl().unregisterTarget(var1, this);
- if (this.refSet.removeElement(var1) && this.refSet.isEmpty()) {
- if (DGCImpl.logLevel >= 20) {
- LogStream.log("dgc").println("Target.unreferenced: reference set is empty: target = " + this);
- }
-
- this.unpinImpl();
- Remote var2 = this.getImpl();
- if (var2 instanceof Unreferenced) {
- new UnreferencedObj((Unreferenced)var2);
- }
- }
-
- }
-
- boolean isEmpty() {
- return this.refSet.isEmpty();
- }
-
- public synchronized void vmidDead(VMID var1) {
- if (DGCImpl.logLevel >= 10) {
- LogStream.log("dgc").println("Target.notify: removing endpoint " + var1 + " from reference set");
- }
-
- this.sequenceTable.remove(var1);
- this.refSetRemove(var1);
- }
- }
-