001    package railo.runtime.engine;
002    
003    import java.io.IOException;
004    import java.util.ArrayList;
005    import java.util.List;
006    
007    import railo.commons.io.SystemUtil;
008    import railo.commons.lang.SerializableObject;
009    import railo.runtime.PageContext;
010    
011    public class ThreadQueueImpl implements ThreadQueue {
012            private final SerializableObject token=new SerializableObject();
013            
014            
015            public final List<PageContext> list=new ArrayList<PageContext>();
016            private final int max;
017            private long timeout;
018            
019            public ThreadQueueImpl(int max, long timeout){
020                    this.max=max;
021                    this.timeout=timeout;
022            }
023            
024            
025            public void enter(PageContext pc) throws IOException {
026                    //print.e("enter("+Thread.currentThread().getName()+"):"+list.size());
027                    long start=System.currentTimeMillis();
028                    while(true) {
029                            synchronized (token) {
030                                    if(list.size()<max) {
031                                            //print.e("- ok("+Thread.currentThread().getName()+"):"+list.size());
032                                            list.add(pc);
033                                            return;
034                                    }
035                            }
036                            if(timeout>0) SystemUtil.wait(token,timeout);
037                            else SystemUtil.wait(token);
038                            
039                            if(timeout>0 && (System.currentTimeMillis()-start)>=timeout)
040                                    throw new IOException("timeout ("+(System.currentTimeMillis()-start)+") ["+timeout+"] is occured, server is busy handling requests");
041                    }
042            }
043            
044            public void exit(PageContext pc){
045                    //print.e("exist("+Thread.currentThread().getName()+")");
046                    synchronized (token) {
047                            list.remove(pc);
048                            token.notify();
049                    }
050            }
051            
052            public int size(){
053                    return list.size();
054            }
055    
056    
057            public void clear() {
058                    list.clear();
059                    token.notifyAll();
060            }
061            
062            
063            /*public static class Test extends Thread {
064                    private ThreadQueueImpl queue;
065                    public Test(ThreadQueueImpl queue){
066                            this.queue=queue;
067                    }
068                    public void run(){
069                            String name = Thread.currentThread().getName();
070                            try {
071                                    queue.enter(name);
072                                    queue.size();
073                                    SystemUtil.sleep(50);
074                                    queue.exit(name);
075                            }
076                            catch (IOException e) {
077                                    e.printStackTrace();
078                            }
079                            
080                            
081                    }
082            }
083            
084            public static void main(String[] args) {
085                    ThreadQueueImpl queue=new ThreadQueueImpl(4,1000);
086                    new Test(queue).start();
087                    new Test(queue).start();
088                    new Test(queue).start();
089                    new Test(queue).start();
090                    new Test(queue).start();
091                    new Test(queue).start();
092                    new Test(queue).start();
093                    new Test(queue).start();
094                    new Test(queue).start();
095                    new Test(queue).start();
096                    new Test(queue).start();
097                    new Test(queue).start();
098                    new Test(queue).start();
099                    new Test(queue).start();
100                    new Test(queue).start();
101                    new Test(queue).start();
102                    new Test(queue).start();
103                    new Test(queue).start();
104                    new Test(queue).start();
105                    new Test(queue).start();
106                    new Test(queue).start();
107                    new Test(queue).start();
108                    new Test(queue).start();
109                    new Test(queue).start();
110                    new Test(queue).start();
111                    new Test(queue).start();
112                    new Test(queue).start();
113                    new Test(queue).start();
114                    new Test(queue).start();
115                    new Test(queue).start();
116                    new Test(queue).start();
117                    new Test(queue).start();
118                    new Test(queue).start();
119                    new Test(queue).start();
120                    new Test(queue).start();
121                    
122                    
123            }*/
124            
125            
126    }