You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2011/09/23 17:44:38 UTC
svn commit: r1174845 -
/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
Author: mduerig
Date: Fri Sep 23 15:44:37 2011
New Revision: 1174845
URL: http://svn.apache.org/viewvc?rev=1174845&view=rev
Log:
Microkernel based Jackrabbit prototype (WIP)
waiting for change polling to terminate may result in deadlocks. Remove unnecessary tight locking
Modified:
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=1174845&r1=1174844&r2=1174845&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Fri Sep 23 15:44:37 2011
@@ -102,7 +102,6 @@ import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
-import java.util.concurrent.Semaphore;
/**
* {@code WorkspaceManager}...
@@ -525,7 +524,7 @@ public final class WorkspaceManager impl
public synchronized void dispose() {
try {
if (changeFeed != null) {
- changeFeed.cancel();
+ changeFeed.shutdown();
}
hierarchyManager.dispose();
if (subscription != null) {
@@ -972,8 +971,7 @@ public final class WorkspaceManager impl
*/
private final class ChangePolling implements Callable<Object> {
private final ExecutorService changePollingExecutor;
- private volatile Future<Object> result; // Used to cancel change polling
- private final Semaphore running = new Semaphore(1); // Used to determine that change polling terminated
+ private volatile Future<Object> result;
public ChangePolling(ExecutorService changePollingExecutor) {
this.changePollingExecutor = changePollingExecutor;
@@ -983,56 +981,40 @@ public final class WorkspaceManager impl
@Override
public Object call() throws Exception {
- try {
- if (running.availablePermits() > 0) {
- running.acquire();
- }
-
- InternalEventListener[] internalEventListeners;
- Subscription subscription;
- synchronized (listeners) {
+ InternalEventListener[] internalEventListeners;
+ Subscription subscription;
+ synchronized (listeners) {
+ subscription = WorkspaceManager.this.subscription;
+ while (subscription == null) {
+ listeners.wait();
subscription = WorkspaceManager.this.subscription;
- while (subscription == null) {
- listeners.wait();
- subscription = WorkspaceManager.this.subscription;
- }
- internalEventListeners = listeners.toArray(new InternalEventListener[listeners.size()]);
}
+ internalEventListeners = listeners.toArray(new InternalEventListener[listeners.size()]);
+ }
- EventBundle[] bundles = null;
- try {
- bundles = service.getEvents(subscription, pollTimeout);
- } catch (UnsupportedRepositoryOperationException e) {
- log.error("SPI implementation does not support observation", e);
- running.release();
- return null;
- } catch (RepositoryException e) {
- log.error("Workspace=" + sessionInfo.getWorkspaceName() + ": Exception while retrieving event bundles", e);
- }
+ EventBundle[] bundles = null;
+ try {
+ bundles = service.getEvents(subscription, pollTimeout);
+ } catch (UnsupportedRepositoryOperationException e) {
+ log.error("SPI implementation does not support observation", e);
+ return null;
+ } catch (RepositoryException e) {
+ log.error("Workspace=" + sessionInfo.getWorkspaceName() + ": Exception while retrieving event bundles", e);
+ }
- if (!Thread.interrupted() && bundles != null && bundles.length > 0) {
- onEventReceived(bundles, internalEventListeners);
- }
+ if (!Thread.interrupted() && bundles != null && bundles.length > 0) {
+ onEventReceived(bundles, internalEventListeners);
+ }
- synchronized (this) {
- if (result != null) {
- result = changePollingExecutor.submit(this);
- return null;
- }
- else {
- // terminate
- running.release();
- return null;
- }
+ synchronized (this) {
+ if (result != null) {
+ result = changePollingExecutor.submit(this);
}
}
- catch (InterruptedException e) {
- running.release();
- throw e;
- }
+ return null;
}
- public void cancel() throws InterruptedException {
+ public void shutdown() {
Future<Object> result;
synchronized (this) {
result = this.result;
@@ -1041,8 +1023,6 @@ public final class WorkspaceManager impl
if (result != null) {
result.cancel(true);
- running.acquire(); // wait for change polling to terminate
- running.release();
}
}
}