package org.jacorb.imr;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1999-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/**
* This class provides shared or exclusive access to a ressource.
* It preferes the exclusive access, i.e. if threads are waiting for
* exclusive access, shared locks can't be gained.
*
* @author Nicolas Noffke
*
*
*/
public class ResourceLock
implements java.io.Serializable
{
private int shared;
private int exclusive;
private boolean exclusives_waiting = false;
/**
* The constructor.
*/
public ResourceLock()
{
shared = 0;
exclusive = 0;
}
/**
* This method tries to aquire a shared lock. It blocks
* until the exclusive lock is released.
*/
public synchronized void gainSharedLock()
{
while(exclusive > 0 && exclusives_waiting)
{
try
{
wait();
}
catch (java.lang.Exception _e)
{
}
}
shared++;
}
/**
* Release the shared lock. Unblocks threads waiting for
* access.
*/
public synchronized void releaseSharedLock()
{
if (--shared == 0)
notifyAll();
}
/**
* This method tries to aquire an exclusive lock. It blocks until
* all shared locks have been released.
*/
public synchronized void gainExclusiveLock()
{
while(shared > 0 || exclusive > 0)
{
try
{
exclusives_waiting = true;
wait();
}
catch (java.lang.Exception _e)
{
}
}
exclusive++;
exclusives_waiting = false;
}
/**
* Releases the exclusive lock. Unblocks all threads waiting
* for access.
*/
public synchronized void releaseExclusiveLock()
{
if (--exclusive == 0)
notifyAll();
}
} // ResourceLock