Revision: 7117
http://jython.svn.sourceforge.net/jython/?rev=7117&view=rev
Author: zyasoft
Date: 2010-09-09 16:28:05 +0000 (Thu, 09 Sep 2010)
Log Message:
-----------
More work on #1327. ThreadStateMapping has a bad implementation of
double-checked locking. The aspect of how it interacts with thread
locals makes it subtle, so I'm going to make the whole lookup
synchronized.
Going forward, we should reconsider the use of ThreadLocal to manage
the ThreadState mapping. Synchronizing this loses any performance from
using ThreadLocal, but we have to deal with the other issues seen
here. Also, I think we should expose the registration process more, in
the case of usage with thread pools.
Modified Paths:
--------------
trunk/jython/src/org/python/core/ThreadStateMapping.java
Modified: trunk/jython/src/org/python/core/ThreadStateMapping.java
===================================================================
--- trunk/jython/src/org/python/core/ThreadStateMapping.java 2010-09-08 20:48:17 UTC (rev 7116)
+++ trunk/jython/src/org/python/core/ThreadStateMapping.java 2010-09-09 16:28:05 UTC (rev 7117)
@@ -9,33 +9,22 @@
}
};
- public ThreadState getThreadState(PySystemState newSystemState) {
+ public synchronized ThreadState getThreadState(PySystemState newSystemState) {
+ ThreadState[] threadLocal = cachedThreadState.get();
+ if (threadLocal[0] != null)
+ return threadLocal[0];
- // usual double checked locking pattern
- ThreadState ts = cachedThreadState.get()[0];
-
- if (ts != null) {
- return ts;
- }
-
- synchronized(this) {
- ThreadState[] threadLocal = cachedThreadState.get();
- if(threadLocal[0] != null)
- return threadLocal[0];
-
- Thread t = Thread.currentThread();
- if (newSystemState == null) {
- Py.writeDebug("threadstate", "no current system state");
- if (Py.defaultSystemState == null) {
- PySystemState.initialize();
- }
- newSystemState = Py.defaultSystemState;
+ Thread t = Thread.currentThread();
+ if (newSystemState == null) {
+ Py.writeDebug("threadstate", "no current system state");
+ if (Py.defaultSystemState == null) {
+ PySystemState.initialize();
}
-
- ts = new ThreadState(t, newSystemState);
-
- newSystemState.registerThreadState(threadLocal, ts);
- return ts;
+ newSystemState = Py.defaultSystemState;
}
+
+ ThreadState ts = new ThreadState(t, newSystemState);
+ newSystemState.registerThreadState(threadLocal, ts);
+ return ts;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|