/* Soot - a J*va Optimization Framework
* Copyright (C) 2003 Jerome Miecznikowski
*
* 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; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package soot.dava.toolkits.base.DavaMonitor;
import java.util.HashMap;
public class DavaMonitor
{
private static final DavaMonitor instance = new DavaMonitor();
private final HashMap<Object, Lock> ref, lockTable;
private DavaMonitor()
{
ref = new HashMap<Object, Lock>( 1, 0.7f);
lockTable = new HashMap<Object, Lock>( 1, 0.7f);
}
public static DavaMonitor v() { return instance; }
public synchronized void enter( Object o) throws NullPointerException
{
Thread currentThread = Thread.currentThread();
if (o == null)
throw new NullPointerException();
Lock lock = ref.get( o);
if (lock == null) {
lock = new Lock();
ref.put( o, lock);
}
if (lock.level == 0) {
lock.level = 1;
lock.owner = currentThread;
return;
}
if (lock.owner == currentThread) {
lock.level++;
return;
}
lockTable.put( currentThread, lock);
lock.enQ( currentThread);
while ((lock.level > 0) || (lock.nextThread() != currentThread)) {
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
System.exit(0);
}
currentThread = Thread.currentThread();
lock = lockTable.get( currentThread);
}
lock.deQ( currentThread);
lock.level = 1;
lock.owner = currentThread;
}
public synchronized void exit( Object o) throws NullPointerException, IllegalMonitorStateException
{
if (o == null)
throw new NullPointerException();
Lock lock = ref.get( o);
if ((lock == null) || (lock.level == 0) || (lock.owner != Thread.currentThread()))
throw new IllegalMonitorStateException();
lock.level--;
if (lock.level == 0)
notifyAll();
}
}