Author: hlship
Date: Sat Jan 19 09:25:52 2008
New Revision: 613426
URL: http://svn.apache.org/viewvc?rev=613426&view=rev
Log:
TAPESTRY-2037: NullPointerException caused by many rapid page refreshes
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ThreadCleanupHubImpl.java
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ThreadCleanupHubImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ThreadCleanupHubImpl.java?rev=613426&r1=613425&r2=613426&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ThreadCleanupHubImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ThreadCleanupHubImpl.java
Sat Jan 19 09:25:52 2008
@@ -41,23 +41,31 @@
_logger = logger;
}
- public synchronized void addThreadCleanupListener(ThreadCleanupListener
listener)
+ private synchronized List<ThreadCleanupListener> get()
{
- _holder.get().add(listener);
+ return _holder.get();
+ }
+
+ private synchronized List<ThreadCleanupListener> getAndRemove()
+ {
+ List<ThreadCleanupListener> result = _holder.get();
+
+ _holder.remove();
+
+ return result;
+ }
+
+ public void addThreadCleanupListener(ThreadCleanupListener listener)
+ {
+ get().add(listener);
}
/**
* Instructs the hub to notify all its listeners (for the current thread).
It also discards its list of listeners.
*/
- public synchronized void cleanup()
+ public void cleanup()
{
- List<ThreadCleanupListener> listeners = _holder.get();
-
- // Discard the listeners. In a perfect world, we would set a
per-thread flag that prevented
- // more listeners from being added, until a new thread begins. But we
don't have a concept
- // of thread start, just thread complete.
-
- _holder.remove();
+ List<ThreadCleanupListener> listeners = getAndRemove();
for (ThreadCleanupListener listener : listeners)
{