/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotools.index; /** * DOCUMENT ME! * * @author Tommaso Nolli * * @source $URL$ */ public class LockManager { private static final int EXCLUSIVE_LOCK_TIMEOUT = 20; private static final int SHARED_LOCK_TIMEOUT = 10; public static final short READ = 1; public static final short WRITE = 2; private Lock exclusiveLock; private int leases; public LockManager() { } public synchronized void release(Lock lock) { LockImpl li = (LockImpl) lock; if (li.getType() == Lock.EXCLUSIVE) { this.exclusiveLock = null; } else { this.leases--; } this.notify(); } /** * DOCUMENT ME! * * * @throws LockTimeoutException * DOCUMENT ME! */ public synchronized Lock aquireExclusive() throws LockTimeoutException { int cnt = 0; while (((this.exclusiveLock != null) || (this.leases > 0)) && (cnt < EXCLUSIVE_LOCK_TIMEOUT)) { cnt++; try { this.wait(500); } catch (InterruptedException e) { throw new LockTimeoutException(e); } } if ((this.exclusiveLock != null) || (this.leases > 0)) { throw new LockTimeoutException("Timeout aquiring exclusive lock"); } this.exclusiveLock = new LockImpl(Lock.EXCLUSIVE); return this.exclusiveLock; } /** * DOCUMENT ME! * * * @throws LockTimeoutException * DOCUMENT ME! */ public synchronized Lock aquireShared() throws LockTimeoutException { int cnt = 0; while ((this.exclusiveLock != null) && (cnt < SHARED_LOCK_TIMEOUT)) { cnt++; try { this.wait(500); } catch (InterruptedException e) { throw new LockTimeoutException(e); } } if (this.exclusiveLock != null) { throw new LockTimeoutException("Timeout aquiring shared lock"); } this.leases++; return new LockImpl(Lock.SHARED); } /** * DOCUMENT ME! * * @author Tommaso Nolli */ private class LockImpl implements Lock { private short type; /** * DOCUMENT ME! * * @param type */ public LockImpl(short type) { this.type = type; } /** * @see org.geotools.index.Lock#getType() */ public short getType() { return this.type; } } }