Hi Alexey,Jeanfrancois,
here is my current patch for making Context sharable.
Jeanfrancois you have to look at resume,cancel to check if
that is what you want...
Many Greetings
John
This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: Context.java
--- Context.java Base (BASE)
+++ Context.java Locally Modified (Based On LOCAL)
@@ -49,12 +49,14 @@
import com.sun.grizzly.util.AttributeHolder;
import com.sun.grizzly.util.Copyable;
import com.sun.grizzly.util.SelectionKeyAttachment;
+import com.sun.grizzly.util.WorkerThread;
import java.io.IOException;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
/**
@@ -186,7 +188,13 @@
*/
private boolean isSuspended = false;
+ /**
+ * Reference Counter indicating How many Threads share this Context.
+ * Starts at one allready counting {_at_link WorkerThread}.
+ */
+ private AtomicInteger refCounter=new AtomicInteger(1);
+
/**
* Constructor
*/
@@ -365,6 +373,7 @@
attributes.clear();
}
isSuspended = false;
+ refCounter.set(1);
}
@@ -799,6 +808,7 @@
public void suspend(){
if (isSuspended) return;
isSuspended = true;
+ incrementRefCount();
setKeyRegistrationState(keyRegistrationState.NONE);
}
@@ -815,15 +825,16 @@
/**
- * Resume a {_at_link #suspend}ed {_at_link Context}. Invoking this method will
- * automatically clean the state of this Context and mark it as a candidate
- * for being re-used by another Thread and connection.
+ * Resume a {_at_link #suspend}ed {_at_link Context}.
+ * <strong>Resume will not call {_at_link Context#recycle}</strong>. So
+ * after the caller is finished using Context caller must
+ * call {_at_link Controller#returnContext(com.sun.grizzly.Context)}
+ * to mark it as a candidate for being re-used by another Thread and connection.
*
* <strong>Important. When resumed, all operations done on this
* object are not thread-safe and there is probability that another
* thread is already using this object. Never use this object once resumed.</strong>
*
- *
* When invoked this method will automatically set the
* {_at_link Context#setKeyRegistrationState} to {_at_link KeyRegistrationState}
* to KeyRegistrationState.REGISTER and automatically re-enable read and
@@ -835,8 +846,6 @@
if (!isSuspended) return;
isSuspended = false;
selectorHandler.register(key, SelectionKey.OP_READ);
- recycle();
- getController().returnContext(this);
}
@@ -859,8 +868,30 @@
if (!isSuspended) return;
isSuspended = false;
selectorHandler.getSelectionKeyHandler().cancel(key);
- recycle();
getController().returnContext(this);
}
+ /**
+ * Called by outer Threads that are not instances of {_at_link WorkerThread} to
+ * indicate that this {_at_link Context} should not be
+ * {_at_link #recycle()} or offered back to its Pool.
+ *
+ * When a outer Thread is done with {_at_link Context} it must call
+ * {_at_link Controller#returnContext(com.sun.grizzly.Context) to
+ * ensure that {_at_link Context} will be propably recycled.
+ *
+ * @return Current Thread reference count
+ */
+ public void incrementRefCount(){
+ refCounter.incrementAndGet();
+ }
+ /**
+ * Decrements the reference count of this Context.
+ * See {_at_link Controller#returnContext(com.sun.grizzly.Context)}
+ * @return return decremented reference count
+ */
+ public int decrementRefCount(){
+ return refCounter.decrementAndGet();
}
+
+}
# This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: Controller.java
--- Controller.java Base (BASE)
+++ Controller.java Locally Modified (Based On LOCAL)
@@ -588,6 +588,10 @@
ctx.configureOpType(key);
}
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "pollContext(..) Context : "+ctx);
+ }
+
return ctx;
}
@@ -599,10 +603,17 @@
}
/**
- * Return a Context to the pool
+ * Return a {_at_link Context} to its pool if it is not shared.
+ *
* @param ctx - the {_at_link Context}
*/
public void returnContext(Context ctx){
+ if(ctx.decrementRefCount()>0) {
+ return;
+ }
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "returnContext() Context : "+ctx);
+ }
ctx.recycle();
contexts.offer(ctx);
}
# This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: ContextTask.java
--- ContextTask.java Base (BASE)
+++ ContextTask.java Locally Modified (Based On LOCAL)
@@ -59,10 +59,6 @@
}
public void recycle() {
- // Do not recycle when suspended.
- if (context.isSuspended()){
- return;
- }
if (context != null) {
context.getController().returnContext(context);
--
Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten
Browser-Versionen downloaden: http://www.gmx.net/de/go/browser