[Mulgara-svn] r1929 - trunk/src/jar/resolver/java/org/mulgara/resolver
pag at mulgara.org
pag at mulgara.org
Wed Mar 3 20:05:54 UTC 2010
Author: pag
Date: 2010-03-03 12:05:53 -0800 (Wed, 03 Mar 2010)
New Revision: 1929
Modified:
trunk/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
Log:
created a new lock for managing transaction state, separate to the lock used for synchronizing between node and string pools
Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java 2010-02-17 22:45:36 UTC (rev 1928)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java 2010-03-03 20:05:53 UTC (rev 1929)
@@ -31,6 +31,8 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
// Third party packages
import org.apache.log4j.Logger;
@@ -129,9 +131,13 @@
/** Where to store literals which won't outlive this session. */
private final StringPool temporaryStringPool;
-
+
+ /** An enumeration of the various states for this session. */
private int state;
+ /** A lock for managing the modification of state. */
+ private Lock stateLock = new ReentrantLock();
+
private SimpleXAResource[] resources;
private Object globalLock;
@@ -262,7 +268,8 @@
public void prepare() throws SimpleXAResourceException {
checkCurrentThread();
try {
- synchronized (globalLock) {
+ stateLock.lock();
+ try {
if (logger.isDebugEnabled()) {
logger.debug("Preparing phase on StringPoolSession " + System.identityHashCode(this) + " SP=" + System.identityHashCode(persistentStringPool));
}
@@ -276,6 +283,8 @@
persistentStringPool.prepare(); // calls prepare on the node pool
for (int i = 0; i < resources.length; i++) resources[i].prepare();
+ } finally {
+ stateLock.unlock();
}
} finally {
releaseCurrentThread();
@@ -286,7 +295,8 @@
public void commit() throws SimpleXAResourceException {
checkCurrentThread();
try {
- synchronized (globalLock) {
+ stateLock.lock();
+ try {
if (logger.isDebugEnabled()) {
logger.debug("Committing phase on StringPoolSession " + System.identityHashCode(this));
}
@@ -298,8 +308,13 @@
state = COMMIT;
- persistentStringPool.commit(); // calls commit() on the node pool
- for (int i = 0; i < resources.length; i++) resources[i].commit();
+ // now holding BOTH the stateLock AND the globalLock. This should be short!
+ synchronized (globalLock) {
+ persistentStringPool.commit(); // calls commit() on the node pool
+ for (int i = 0; i < resources.length; i++) resources[i].commit();
+ }
+ } finally {
+ stateLock.unlock();
}
} finally {
releaseCurrentThread();
@@ -310,7 +325,8 @@
public void rollback() throws SimpleXAResourceException {
checkCurrentThread();
try {
- synchronized (globalLock) {
+ stateLock.lock();
+ try {
if (logger.isDebugEnabled()) {
logger.debug("Rollback phase on StringPoolSession " + System.identityHashCode(this));
}
@@ -320,6 +336,8 @@
state = ROLLBACK;
persistentStringPool.rollback(); // calls rollback on the node pool
for (int i = 0; i < resources.length; i++) resources[i].rollback();
+ } finally {
+ stateLock.unlock();
}
} finally {
releaseCurrentThread();
@@ -330,7 +348,8 @@
public void release() throws SimpleXAResourceException {
checkCurrentThread();
try {
- synchronized (globalLock) {
+ stateLock.lock();
+ try {
if (logger.isDebugEnabled()) {
logger.debug("Release phase on StringPoolSession " + System.identityHashCode(this));
}
@@ -348,6 +367,8 @@
//temporaryStringPool.release();
//temporaryNodePool.release();
for (int i = 0; i < resources.length; i++) resources[i].release();
+ } finally {
+ stateLock.unlock();
}
} finally {
releaseCurrentThread();
More information about the Mulgara-svn
mailing list