You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/01/20 06:43:27 UTC
svn commit: r1653195 -
/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java
Author: cziegeler
Date: Tue Jan 20 05:43:26 2015
New Revision: 1653195
URL: http://svn.apache.org/r1653195
Log:
SLING-4335 : Deadlock on startup due to SLING-4197
Modified:
sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java
Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java?rev=1653195&r1=1653194&r2=1653195&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java Tue Jan 20 05:43:26 2015
@@ -18,10 +18,7 @@
*/
package org.apache.sling.launchpad.base.impl;
-import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
@@ -110,14 +107,17 @@ public class DefaultStartupHandler
this.listenerTracker = new ServiceTracker<StartupListener, StartupListener>(context, StartupListener.class,
new ServiceTrackerCustomizer<StartupListener, StartupListener>() {
+ @Override
public void removedService(final ServiceReference<StartupListener> reference, final StartupListener service) {
context.ungetService(reference);
}
+ @Override
public void modifiedService(final ServiceReference<StartupListener> reference, final StartupListener service) {
// nothing to do
}
+ @Override
public StartupListener addingService(final ServiceReference<StartupListener> reference) {
final StartupListener listener = context.getService(reference);
if (listener != null) {
@@ -155,6 +155,7 @@ public class DefaultStartupHandler
/**
* @see org.apache.sling.launchpad.api.StartupHandler#getMode()
*/
+ @Override
public StartupMode getMode() {
return this.startupMode;
}
@@ -162,6 +163,7 @@ public class DefaultStartupHandler
/**
* @see org.apache.sling.launchpad.api.StartupHandler#isFinished()
*/
+ @Override
public boolean isFinished() {
return this.finished.get();
}
@@ -169,6 +171,7 @@ public class DefaultStartupHandler
/**
* @see java.lang.Runnable#run()
*/
+ @Override
public void run() {
while ( !this.finished.get() ) {
Boolean doInc = null;
@@ -205,6 +208,7 @@ public class DefaultStartupHandler
/**
* @see org.apache.sling.launchpad.api.StartupHandler#waitWithStartup(boolean)
*/
+ @Override
public void waitWithStartup(final boolean flag) {
logger.log(Logger.LOG_DEBUG, "Wait with startup " + flag);
if ( flag ) {
@@ -241,6 +245,7 @@ public class DefaultStartupHandler
/**
* @see org.osgi.framework.FrameworkListener#frameworkEvent(org.osgi.framework.FrameworkEvent)
*/
+ @Override
public void frameworkEvent(final FrameworkEvent event) {
if ( finished.get() ) {
return;
@@ -279,7 +284,7 @@ public class DefaultStartupHandler
logger.log(Logger.LOG_INFO, "Startup finished.");
this.finished.set(true);
- for (StartupListener listener : this.getStartupListeners()) {
+ for (final StartupListener listener : this.listenerTracker.getServices(new StartupListener[0])) {
try {
listener.startupFinished(this.startupMode);
} catch (Throwable t) {
@@ -305,7 +310,7 @@ public class DefaultStartupHandler
* @param ratio ratio
*/
private void startupProgress(final float ratio) {
- for (StartupListener listener : this.getStartupListeners()) {
+ for (final StartupListener listener : this.listenerTracker.getServices(new StartupListener[0])) {
try {
listener.startupProgress(ratio);
} catch (Throwable t) {
@@ -317,6 +322,7 @@ public class DefaultStartupHandler
/**
* @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
*/
+ @Override
public void bundleChanged(final BundleEvent event) {
if (!finished.get()) {
logger.log(Logger.LOG_DEBUG, "Received bundle event " + event);
@@ -335,56 +341,4 @@ public class DefaultStartupHandler
}
}
}
-
- private Iterable<StartupListener> getStartupListeners() {
- final ServiceReference<StartupListener>[] refs = this.listenerTracker.getServiceReferences();
- if (refs == null || refs.length == 0) {
- return Collections.<StartupListener>emptyList();
- }
-
- return new Iterable<StartupListener>() {
-
- @Override
- public Iterator<StartupListener> iterator() {
- return new Iterator<StartupListener>() {
-
- private int i = 0;
-
- private StartupListener next = seek();
-
- @Override
- public StartupListener next() {
- if (this.next == null) {
- throw new NoSuchElementException();
- }
-
- final StartupListener result = this.next;
- this.next = seek();
- return result;
- }
-
- @Override
- public boolean hasNext() {
- return this.next != null;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- private StartupListener seek() {
- for (; i < refs.length; i++) {
- final StartupListener sl = DefaultStartupHandler.this.listenerTracker.getService(refs[i]);
- if (sl != null) {
- return sl;
- }
- }
-
- return null;
- }
- };
- }
- };
- }
}