/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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.
*/
abstract class FileLockTable {
protected FileLockTable() {
}
/**
* Creates and returns a file lock table for a channel that is connected to
* the a system-wide map of all file locks for the Java virtual machine.
*/
throws IOException
{
}
/**
* Adds a file lock to the table.
*
* @throws OverlappingFileLockException if the file lock overlaps
* with an existing file lock in the table
*/
/**
* Remove an existing file lock from the table.
*/
/**
* Removes all file locks from the table.
*
* @return The list of file locks removed
*/
/**
* Replaces an existing file lock in the table.
*/
}
/**
* A file lock table that is over a system-wide map of all file locks.
*/
/**
* A weak reference to a FileLock.
* <p>
* SharedFileLockTable uses a list of file lock references to avoid keeping the
* FileLock (and FileChannel) alive.
*/
}
return fileKey;
}
}
// The system-wide map is a ConcurrentHashMap that is keyed on the FileKey.
// The map value is a list of file locks represented by FileLockReferences.
// All access to the list must be synchronized on the list.
// reference queue for cleared refs
// The connection to which this table is connected
// File key for the file that this channel is connected to
}
for (;;) {
// The key isn't in the map so we try to create it atomically
synchronized (list) {
// we successfully created the key so we add the file lock
break;
}
}
// someone else got there first
}
// There is already a key. It is possible that some other thread
// is removing it so we re-fetch the value from the map. If it
// hasn't changed then we check the list for overlapping locks
// and add the new lock to the list.
synchronized (list) {
break;
}
}
}
// process any stale entries pending in the reference queue
}
}
}
// the lock must exist so the list of locks must be present
synchronized (list) {
int index = 0;
break;
}
index++;
}
}
}
synchronized (list) {
int index = 0;
// remove locks obtained by this channel
// remove the lock from the list
// add to result
} else {
index++;
}
}
// once the lock list is empty we remove it from the map
}
}
return result;
}
// the lock must exist so there must be a list
synchronized (list) {
break;
}
}
}
}
// Check for overlapping file locks
throws OverlappingFileLockException
{
throw new OverlappingFileLockException();
}
}
// Process the reference queue
private void removeStaleEntries() {
synchronized (list) {
}
}
}
}
}