001/**
002 *
003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
004 *
005 * This library is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public
007 * License as published by the Free Software Foundation; either 
008 * version 2.1 of the License, or (at your option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013 * Lesser General Public License for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public 
016 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
017 * 
018 **/
019package lucee.commons.lock;
020
021import java.util.concurrent.TimeUnit;
022import java.util.concurrent.locks.ReentrantLock;
023
024public class SimpleLock<L> implements Lock {
025        
026        private ReentrantLock lock;
027        private L label;
028        
029        public SimpleLock(L label) {
030                this.lock=new ReentrantLock(true);
031                this.label=label;
032        }
033
034        
035        @Override
036        public void lock(long timeout) throws LockException {
037                if(timeout<=0) throw new LockException("timeout must be a postive number");
038                long initialTimeout=timeout;
039                long start=System.currentTimeMillis();
040                do{
041                        try {
042                                if(!lock.tryLock(timeout, TimeUnit.MILLISECONDS)){
043                                        throw new LockException(initialTimeout);
044                                }
045                                break; // exit loop
046                        }
047                        catch (InterruptedException e) {
048                                timeout-=System.currentTimeMillis()-start;
049                        }
050                        if(timeout<=0) {
051                                // Lucee was not able to aquire lock in time
052                                throw new LockException(initialTimeout);
053                        }
054                }
055                while(true);
056                
057        }
058
059        @Override
060        public void unlock()    {
061                lock.unlock();
062        }
063        
064        /**
065     * Returns an estimate of the number of threads waiting to
066     * acquire this lock.  The value is only an estimate because the number of
067     * threads may change dynamically while this method traverses
068     * internal data structures.  This method is designed for use in
069     * monitoring of the system state, not for synchronization
070     * control.
071     *
072     * @return the estimated number of threads waiting for this lock
073     */
074    public int getQueueLength() {
075                return lock.getQueueLength();
076        }
077    
078
079        public L getLabel(){
080                return label;
081        }
082}