001: // kelondroLock.java
002: // -----------------------
003: // part of YaCy
004: // (C) by Michael Peter Christen; mc@anomic.de
005: // first published on http://www.anomic.de
006: // Frankfurt, Germany, 2005
007: // Created 08.12.2005
008: //
009: // This program is free software; you can redistribute it and/or modify
010: // it under the terms of the GNU General Public License as published by
011: // the Free Software Foundation; either version 2 of the License, or
012: // (at your option) any later version.
013: //
014: // This program is distributed in the hope that it will be useful,
015: // but WITHOUT ANY WARRANTY; without even the implied warranty of
016: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
017: // GNU General Public License for more details.
018: //
019: // You should have received a copy of the GNU General Public License
020: // along with this program; if not, write to the Free Software
021: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022: //
023: // Using this software in any meaning (reading, learning, copying, compiling,
024: // running) means that you agree that the Author(s) is (are) not responsible
025: // for cost, loss of data or any harm that may be caused directly or indirectly
026: // by usage of this softare or this documentation. The usage of this software
027: // is on your own risk. The installation and usage (starting/running) of this
028: // software may allow other people or application to access your computer and
029: // any attached devices and is highly dependent on the configuration of the
030: // software which must be done by the user of the software; the author(s) is
031: // (are) also not responsible for proper configuration and usage of the
032: // software, even if provoked by documentation provided together with
033: // the software.
034: //
035: // Any changes to this file according to the GPL as documented in the file
036: // gpl.txt aside this file in the shipment you received can be done to the
037: // lines that follows this copyright notice here, but changes must not be
038: // done inside the copyright notive above. A re-distribution must contain
039: // the intact and unchanged copyright notice.
040: // Contributions and changes to the program code must be marked as such.
041:
042: package de.anomic.kelondro;
043:
044: public class kelondroLock {
045:
046: private boolean lock;
047: private long releaseTime;
048:
049: public kelondroLock() {
050: lock = false;
051: releaseTime = 0;
052: }
053:
054: public synchronized void apply() {
055: // this applies a lock to this objekt
056: // if the lock is already applied
057: // this object waits until it is released and applies it then again
058: // before it returns
059: apply(-1);
060: }
061:
062: public synchronized void apply(long millis) {
063: // sets a lock that is valid for a specific time
064: // if the time is over, the lock is released automatically
065: if (locked()) {
066: do {
067: try {
068: wait(100);
069: } catch (InterruptedException e) {
070: } catch (Exception e) {
071: e.printStackTrace();
072: }
073: } while (locked());
074: }
075: lock = true;
076: releaseTime = (millis < 0) ? Long.MAX_VALUE : System
077: .currentTimeMillis()
078: + millis;
079: }
080:
081: public synchronized boolean stay(long waitMillis, long lockMillis) {
082: // this tries to apply a lock, but does not block infinitely until
083: // the lock is released. If after the given time the lock is not released
084: // the method returns with false and no more lock is applied
085: // if the lock was applied successfully, it returns with true
086: if (locked()) {
087: try {
088: wait(waitMillis);
089: } catch (InterruptedException e) {
090: } catch (Exception e) {
091: e.printStackTrace();
092: }
093: if (locked())
094: return false;
095: }
096: lock = true;
097: releaseTime = (lockMillis < 0) ? Long.MAX_VALUE : System
098: .currentTimeMillis()
099: + lockMillis;
100: return true;
101: }
102:
103: public synchronized void release() {
104: // this must be called to releas the lock to the object
105: // if it is not released, possibly all other tasks are blocked
106: if (locked()) {
107: lock = false;
108: releaseTime = 0;
109: notify();
110: }
111: }
112:
113: public synchronized boolean locked() {
114: return lock && (System.currentTimeMillis() < releaseTime);
115: }
116: }
|