Index: TCPSelectorHandler.java =================================================================== --- TCPSelectorHandler.java (revision 714) +++ TCPSelectorHandler.java (working copy) @@ -675,7 +675,7 @@ if (attach instanceof CallbackHandler){ final Context context = pollContext(ctx, key); context.setCurrentOpType(Context.OpType.OP_CONNECT); - invokeCallbackHandler((CallbackHandler) attach, context); + invokeCallbackHandler((CallbackHandler) attach, context, false); } return false; } @@ -687,7 +687,20 @@ * @throws java.io.IOException */ protected void invokeCallbackHandler(CallbackHandler callbackHandler, - Context context) throws IOException{ + Context context) throws IOException { + invokeCallbackHandler(callbackHandler, context, true); + } + + + /** + * Invoke a CallbackHandler via a Context instance. + * @param context Context + * @param runInSeparateThread if true - CallbackHandler will + * be executed in separate thread, false - in current thread. + * @throws java.io.IOException + */ + protected void invokeCallbackHandler(CallbackHandler callbackHandler, + Context context, boolean runInSeparateThread) throws IOException{ IOEventioEvent = new IOEvent.DefaultIOEvent(context); context.setIOEvent(ioEvent); @@ -697,13 +710,13 @@ try { CallbackHandlerContextTask task = CallbackHandlerContextTask.poll(); task.setCallBackHandler(callbackHandler); - context.execute(task); + context.execute(task, runInSeparateThread); } catch (PipelineFullException ex){ throw new IOException(ex.getMessage()); } } + - /** * Invoke a AsyncQueueReader * @param context Context Index: Context.java =================================================================== --- Context.java (revision 712) +++ Context.java (working copy) @@ -38,6 +38,7 @@ import java.nio.channels.SelectionKey; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; /** * This Object is used to share information between the Grizzly Framework @@ -389,13 +390,36 @@ * @throws com.sun.grizzly.PipelineFullException */ public void execute(ContextTask contextTask) throws PipelineFullException { + execute(contextTask, true); + } + + + /** + * Execute this Context using either Controller's Pipeline or current thread + * @param contextTask ContextTask, which will be + * executed by Pipeline + * @param runInSeparateThread if true - ContextTask will + * be executed in separate thread, false - in current thread. + * @throws com.sun.grizzly.PipelineFullException + */ + public void execute(ContextTask contextTask, boolean runInSeparateThread) throws PipelineFullException { if (contextTask != null) { contextTask.setContext(this); - getPipeline().execute(contextTask); + if (runInSeparateThread) { + getPipeline().execute(contextTask); + } else { + try { + contextTask.call(); + } catch(Exception e) { + Controller.logger().log(Level.SEVERE, + "Unexpected exception occured, when executing task: " + + contextTask, e); + } + } } } + - /** * Return the Pipeline executing this instance. * @return Pipeline