jstrachan 2003/08/27 09:28:31 Added: messenger/src/java/org/apache/commons/messenger Lock.java messenger/src/test/org/apache/commons/messenger LockTest.java Log: added a simple Lock class which I'm about to use in another Messenger imnplementation Revision Changes Path 1.1 jakarta-commons-sandbox/messenger/src/java/org/apache/commons/messenger/Lock.java Index: Lock.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. * * $Id: Lock.java,v 1.1 2003/08/27 16:28:31 jstrachan Exp $ */ package org.apache.commons.messenger; import javax.jms.JMSException; /** <p><code>Lock</code> is a simple lock. * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> * @version $Revision: 1.1 $ */ public class Lock { private Thread owner; private int count; /** * Acquires the lock, blocking until the lock can be acquired * @throws InterruptedException */ public void acquire() { Thread caller = Thread.currentThread(); synchronized (this) { if (caller == owner) { count++; } else { while (owner != null) { try { wait(); } catch (InterruptedException ex) { // ignore } } owner = caller; count = 1; } } } /** * Release the lock. **/ public synchronized void release() throws JMSException { if (Thread.currentThread() != owner) { throw new JMSException("Cannot release lock - not the current owner"); } else { if (--count == 0) { owner = null; notify(); } } } /** * @return */ public synchronized boolean hasLock() { return Thread.currentThread() == owner; } } 1.1 jakarta-commons-sandbox/messenger/src/test/org/apache/commons/messenger/LockTest.java Index: LockTest.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. * * $Id: LockTest.java,v 1.1 2003/08/27 16:28:31 jstrachan Exp $ */ package org.apache.commons.messenger; import javax.jms.JMSException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; /** Test harness for the Lock class * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> * @version $Revision: 1.1 $ */ public class LockTest extends TestCase { public static Test suite() { return new TestSuite(LockTest.class); } public static void main(String[] args) { TestRunner.run(suite()); } public LockTest(String testName) { super(testName); } public void testNormalLockOperation() throws Exception { Lock lock = new Lock(); assertFalse("should not have the lock yet", lock.hasLock()); lock.acquire(); assertTrue("have lock", lock.hasLock()); lock.release(); assertFalse("have released the lock", lock.hasLock()); try { lock.release(); fail("Should have thrown an exception"); } catch (JMSException e) { // ignore } } public void testNestedLockOperation() throws Exception { Lock lock = new Lock(); lock.acquire(); assertTrue("have lock", lock.hasLock()); lock.acquire(); assertTrue("have lock", lock.hasLock()); lock.release(); assertTrue("have lock", lock.hasLock()); lock.release(); assertFalse("have released the lock", lock.hasLock()); try { lock.release(); fail("Should have thrown an exception"); } catch (JMSException e) { // ignore } } public void testReleaseBeforeAcquireShouldFail() throws Exception { Lock lock = new Lock(); try { lock.release(); fail("Should have thrown an exception"); } catch (JMSException e) { // ignore } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]