001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: import com.protomatter.syslog.Syslog;
054: import java.util.*;
055:
056: /**
057: * A mutex.
058: */
059: public class Mutex {
060: private MutexObject mutex = new MutexObject();
061: private MutexToken token = null;
062: private Thread currentThread = null;
063:
064: /**
065: * Create a new mutex.
066: */
067: public Mutex() {
068: super ();
069: }
070:
071: /**
072: * Obtain the lock on the mutex. This method blocks, and threads
073: * are stacked in the order they call this method.
074: */
075: public void getLock() {
076: try {
077: token = (MutexToken) mutex.checkout();
078: this .currentThread = Thread.currentThread();
079: } catch (Exception x) {
080: Syslog.log(this , x);
081: ; // this cannot happen the way the MutexObject is written.
082: // it's part of the generic object pooling stuff.
083: }
084: }
085:
086: /**
087: * Determine if this mutex is currently locked by anyone.
088: */
089: public boolean isLocked() {
090: return (this .currentThread != null);
091: }
092:
093: /**
094: * Get a reference to the thread that currently has the lock.
095: * Returns null if nobody has the lock.
096: */
097: public Thread getLockingThread() {
098: return this .currentThread;
099: }
100:
101: /**
102: * Release the lock on the mutex. Users of this class should be
103: * nice about using this method -- don't call it unless you've
104: * already called <tt>getLock()</tt>, since this does not check
105: * to make sure the caller is really the lock owner.
106: */
107: public void releaseLock() {
108: try {
109: synchronized (mutex.getSyncObject()) {
110: mutex.checkin(token);
111: this .currentThread = null;
112: }
113: } catch (Exception x) {
114: Syslog.log(this , x);
115: ; // this cannot happen the way the MutexObject is written.
116: // it's part of the generic object pooling stuff.
117: }
118: }
119: }
|