home *** CD-ROM | disk | FTP | other *** search
- package com.everyware.tango.jas;
-
- import java.net.Socket;
- import java.util.Enumeration;
- import java.util.Vector;
-
- public class ThreadManager extends Thread implements ResourceManager, Timeable {
- private JAS jas;
- private ThreadGroup threadGroup = new ThreadGroup("JAS resources");
- private Vector resources = new Vector();
- private Vector freeThreads = new Vector();
- private Vector pendingRequests = new Vector();
-
- public ThreadManager(JAS var1) {
- this.jas = var1;
- if (var1.isTracing) {
- var1.traceM.trace("TM: initializing...");
- }
-
- for(int var2 = 0; var2 < var1.getMaxNumThreads(); ++var2) {
- MessageHandler var3 = new MessageHandler(var1, this);
- Thread var4 = new Thread(this.threadGroup, var3);
- this.resources.addElement(new Resource(var4, var3));
- if (var1.isTracing) {
- var1.traceM.trace("TM: added another resource...");
- }
- }
-
- if (var1.isTracing) {
- var1.traceM.trace("TM: all set up.");
- }
-
- }
-
- public boolean hasFreeResources() {
- return !this.freeThreads.isEmpty();
- }
-
- public synchronized void newRequest(Socket var1) {
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: new request: " + var1);
- }
-
- this.pendingRequests.addElement(var1);
- }
-
- private synchronized Socket getNextPendingRequest() {
- Socket var1 = (Socket)this.pendingRequests.firstElement();
- this.pendingRequests.removeElement(var1);
- return var1;
- }
-
- public synchronized void requestHandled(Object var1) {
- Thread var2 = (Thread)var1;
- this.jas.getTimer().deregister(var2);
- this.freeThreads.addElement(var2);
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Added thread to the free list");
- }
-
- }
-
- public void eventElapsed(Object var1) {
- Thread var2 = (Thread)var1;
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Received notification of errant event!");
- }
-
- Resource var3 = null;
- Enumeration var4 = this.resources.elements();
-
- while(var4.hasMoreElements()) {
- Resource var5 = (Resource)var4.nextElement();
- if (var5.thread.equals(var2)) {
- var3 = var5;
- break;
- }
- }
-
- if (var3 == null) {
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Could not locate resource of elapsed event!");
- }
-
- } else {
- var3.thread.stop();
- var3.thread = null;
- var3.messageHandler = null;
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Create new thread");
- }
-
- var3.messageHandler = new MessageHandler(this.jas, this);
- var3.thread = new Thread(this.threadGroup, var3.messageHandler);
- var3.thread.start();
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Adding new thread to free list");
- }
-
- this.freeThreads.addElement(var3.thread);
- }
- }
-
- private synchronized void assignFreeResource(Socket var1) {
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Looking for a free resource to assign a request");
- }
-
- Thread var2 = (Thread)this.freeThreads.firstElement();
- this.freeThreads.removeElement(var2);
- Enumeration var3 = this.resources.elements();
-
- while(var3.hasMoreElements()) {
- Resource var4 = (Resource)var3.nextElement();
- if (var4.thread.equals(var2)) {
- if (this.jas.getActionTimeout() > 0) {
- try {
- this.jas.getTimer().register(this, var4.thread, this.jas.getActionTimeout());
- } catch (Exception var6) {
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Could not register request with TR: " + var6);
- }
-
- this.freeThreads.addElement(var2);
- return;
- }
-
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Registered request with TMR");
- }
- }
-
- var4.messageHandler.setSocket(var1);
- var4.thread.resume();
- return;
- }
- }
-
- if (this.jas.isTracing) {
- this.jas.traceM.trace("TM: Should have located a message handler!");
- }
-
- }
-
- public void run() {
- Enumeration var1 = this.resources.elements();
-
- while(var1.hasMoreElements()) {
- Thread var2 = ((Resource)var1.nextElement()).thread;
- var2.start();
- this.freeThreads.addElement(var2);
- }
-
- while(true) {
- while(this.pendingRequests.isEmpty() || this.freeThreads.isEmpty()) {
- try {
- Thread.sleep(5L);
- } catch (InterruptedException var3) {
- }
- }
-
- this.assignFreeResource(this.getNextPendingRequest());
- }
- }
- }
-