--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.rmi/share/classes/java/rmi/dgc/DGC.java Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.rmi.dgc;
+
+import java.rmi.*;
+import java.rmi.server.ObjID;
+
+/**
+ * The DGC abstraction is used for the server side of the distributed
+ * garbage collection algorithm. This interface contains the two
+ * methods: dirty and clean. A dirty call is made when a remote
+ * reference is unmarshaled in a client (the client is indicated by
+ * its VMID). A corresponding clean call is made when no more
+ * references to the remote reference exist in the client. A failed
+ * dirty call must schedule a strong clean call so that the call's
+ * sequence number can be retained in order to detect future calls
+ * received out of order by the distributed garbage collector.
+ *
+ * A reference to a remote object is leased for a period of time by
+ * the client holding the reference. The lease period starts when the
+ * dirty call is received. It is the client's responsibility to renew
+ * the leases, by making additional dirty calls, on the remote
+ * references it holds before such leases expire. If the client does
+ * not renew the lease before it expires, the distributed garbage
+ * collector assumes that the remote object is no longer referenced by
+ * that client.
+ *
+ * @author Ann Wollrath
+ */
+public interface DGC extends Remote {
+
+ /**
+ * The dirty call requests leases for the remote object references
+ * associated with the object identifiers contained in the array
+ * 'ids'. The 'lease' contains a client's unique VM identifier (VMID)
+ * and a requested lease period. For each remote object exported
+ * in the local VM, the garbage collector maintains a reference
+ * list-a list of clients that hold references to it. If the lease
+ * is granted, the garbage collector adds the client's VMID to the
+ * reference list for each remote object indicated in 'ids'. The
+ * 'sequenceNum' parameter is a sequence number that is used to
+ * detect and discard late calls to the garbage collector. The
+ * sequence number should always increase for each subsequent call
+ * to the garbage collector.
+ *
+ * Some clients are unable to generate a VMID, since a VMID is a
+ * universally unique identifier that contains a host address
+ * which some clients are unable to obtain due to security
+ * restrictions. In this case, a client can use a VMID of null,
+ * and the distributed garbage collector will assign a VMID for
+ * the client.
+ *
+ * The dirty call returns a Lease object that contains the VMID
+ * used and the lease period granted for the remote references (a
+ * server may decide to grant a smaller lease period than the
+ * client requests). A client must use the VMID the garbage
+ * collector uses in order to make corresponding clean calls when
+ * the client drops remote object references.
+ *
+ * A client VM need only make one initial dirty call for each
+ * remote reference referenced in the VM (even if it has multiple
+ * references to the same remote object). The client must also
+ * make a dirty call to renew leases on remote references before
+ * such leases expire. When the client no longer has any
+ * references to a specific remote object, it must schedule a
+ * clean call for the object ID associated with the reference.
+ *
+ * @param ids IDs of objects to mark as referenced by calling client
+ * @param sequenceNum sequence number
+ * @param lease requested lease
+ * @return granted lease
+ * @throws RemoteException if dirty call fails
+ */
+ Lease dirty(ObjID[] ids, long sequenceNum, Lease lease)
+ throws RemoteException;
+
+ /**
+ * The clean call removes the 'vmid' from the reference list of
+ * each remote object indicated in 'id's. The sequence number is
+ * used to detect late clean calls. If the argument 'strong' is
+ * true, then the clean call is a result of a failed dirty call,
+ * thus the sequence number for the client 'vmid' needs to be
+ * remembered.
+ *
+ * @param ids IDs of objects to mark as unreferenced by calling client
+ * @param sequenceNum sequence number
+ * @param vmid client VMID
+ * @param strong make 'strong' clean call
+ * @throws RemoteException if clean call fails
+ */
+ void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong)
+ throws RemoteException;
+}