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