/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.supportregression.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.HashSet;
/**
* Singleton class for testing out multi-threaded code.
* Allows reservation and de-reservation of any Object. Reserved objects are added to a HashSet and
* removed from the HashSet upon de-reservation.
*/
public class ObjectReservationSingleton
{
private HashSet<Object> reservedObjects = new HashSet<Object>();
private Lock reservedIdsLock = new ReentrantLock();
private static ObjectReservationSingleton ourInstance = new ObjectReservationSingleton();
public static ObjectReservationSingleton getInstance()
{
return ourInstance;
}
private ObjectReservationSingleton()
{
}
/**
* Reserve an object, returning true when successfully reserved or false when the object is already reserved.
* @param object - object to reserve
* @return true if reserved, false to indicate already reserved
*/
public boolean reserve(Object object)
{
reservedIdsLock.lock();
if (reservedObjects.contains(object))
{
reservedIdsLock.unlock();
return false;
}
reservedObjects.add(object);
reservedIdsLock.unlock();
return true;
}
/**
* Unreserve an object. Logs a fatal error if the unreserve failed.
* @param object - object to unreserve
*/
public void unreserve(Object object)
{
reservedIdsLock.lock();
if (!reservedObjects.contains(object))
{
log.error(".unreserve FAILED, object=" + object);
reservedIdsLock.unlock();
return;
}
reservedObjects.remove(object);
reservedIdsLock.unlock();
}
private static final Logger log = LoggerFactory.getLogger(ObjectReservationSingleton.class);
}