### Eclipse Workspace Patch 1.0
#P JBossRemoting-2.5.3.SP1
Index: src/main/org/jboss/remoting/transport/bisocket/BisocketServerInvoker.java
===================================================================
--- src/main/org/jboss/remoting/transport/bisocket/BisocketServerInvoker.java	(revision 5932)
+++ src/main/org/jboss/remoting/transport/bisocket/BisocketServerInvoker.java	(working copy)
@@ -62,6 +62,8 @@
 import org.jboss.remoting.transport.socket.SocketServerInvoker;
 import org.jboss.remoting.util.SecurityUtility;
 
+import EDU.oswego.cs.dl.util.concurrent.Semaphore;
+
 
 /**
  *
@@ -1092,6 +1094,7 @@
    {
       private ServerSocket secondaryServerSocket;
       boolean running = true;
+      Semaphore semaphore = new Semaphore(maxPoolSize);
 
       SecondaryServerSocketThread(ServerSocket secondaryServerSocket) throws IOException
       {
@@ -1127,41 +1130,7 @@
                }
                
                if (log.isTraceEnabled()) log.trace("accepted: " + socket);
-               DataInputStream dis = new DataInputStream(socket.getInputStream());
-               int action = dis.read();
-               String listenerId = dis.readUTF();
-
-               switch (action)
-               {
-                  case Bisocket.CREATE_CONTROL_SOCKET:
-                     BisocketClientInvoker.transferSocket(listenerId, socket, true);
-                     if (log.isTraceEnabled()) 
-                        log.trace("SecondaryServerSocketThread: created control socket: (" + socket + ")"+ listenerId);
-                     break;
-                     
-                  case Bisocket.RECREATE_CONTROL_SOCKET:
-                     BisocketClientInvoker invoker =  BisocketClientInvoker.getBisocketCallbackClientInvoker(listenerId);
-                     if (invoker == null)
-                     {
-                        log.debug("received new control socket for unrecognized listenerId: " + listenerId);
-                     }
-                     else
-                     {
-                        invoker.replaceControlSocket(socket);
-                        if (log.isTraceEnabled())
-                           log.trace("SecondaryServerSocketThread: recreated control socket: " + listenerId);
-                     }
-                     break;
-
-                  case Bisocket.CREATE_ORDINARY_SOCKET:
-                     BisocketClientInvoker.transferSocket(listenerId, socket, false);
-                     if (log.isTraceEnabled())
-                        log.trace("SecondaryServerSocketThread: transferred socket: " + listenerId);
-                     break;
-
-                  default:
-                     log.error("unrecognized action on SecondaryServerSocketThread: " + action);
-               }
+               processSocket(socket);
             }
             catch (IOException e)
             {
@@ -1174,6 +1143,86 @@
          }
       }
 
+      void processSocket(final Socket socket) throws IOException
+      {
+         while (true)
+         {
+            try
+            {
+               semaphore.acquire();
+               break;
+            }
+            catch (InterruptedException e)
+            {
+               if (log.isTraceEnabled()) log.trace(this + " unexpected interrupt");
+            }
+         }
+
+         new Thread()
+         {
+            public void run()
+            {
+               setName("processSocketThread[" + (maxPoolSize - semaphore.permits() - 1)+ "," + socket + "]");
+               if (log.isTraceEnabled()) log.trace(this + " processing socket: " + socket);
+               try
+               {
+                  socket.setSoTimeout(30000);
+                  DataInputStream dis = new DataInputStream(socket.getInputStream());
+                  int action = dis.read();
+                  String listenerId = dis.readUTF();
+
+                  switch (action)
+                  {
+                     case Bisocket.CREATE_CONTROL_SOCKET:
+                        BisocketClientInvoker.transferSocket(listenerId, socket, true);
+                        if (log.isTraceEnabled()) 
+                           log.trace("SecondaryServerSocketThread: created control socket: (" + socket + ")"+ listenerId);
+                        break;
+
+                     case Bisocket.RECREATE_CONTROL_SOCKET:
+                        BisocketClientInvoker invoker =  BisocketClientInvoker.getBisocketCallbackClientInvoker(listenerId);
+                        if (invoker == null)
+                        {
+                           log.debug("received new control socket for unrecognized listenerId: " + listenerId);
+                        }
+                        else
+                        {
+                           invoker.replaceControlSocket(socket);
+                           if (log.isTraceEnabled())
+                              log.trace("SecondaryServerSocketThread: recreated control socket: " + listenerId);
+                        }
+                        break;
+
+                     case Bisocket.CREATE_ORDINARY_SOCKET:
+                        BisocketClientInvoker.transferSocket(listenerId, socket, false);
+                        if (log.isTraceEnabled())
+                           log.trace("SecondaryServerSocketThread: transferred socket: " + listenerId);
+                        break;
+
+                     default:
+                        log.error("unrecognized action on SecondaryServerSocketThread: " + action);
+                  }
+               }
+               catch (IOException e)
+               {
+                  if (running)
+                  {
+                     log.error(this + " unable to process socket", e);
+                  }
+                  else
+                  {
+                     log.debug(this + " unable to process socket", e);
+                  }
+               }
+               finally
+               {
+                  semaphore.release();
+                  if (log.isTraceEnabled()) log.trace(this + " processed socket: " + socket);
+               }
+            }
+         }.start();
+      }
+      
       ServerSocket getServerSocket()
       {
          return secondaryServerSocket;

