Merge pull request #22 from amichair/fix-fastbin-activator

ARIES-1835 - Fix fastbin activator
diff --git a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/BaseActivator.java b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/BaseActivator.java
index 98752c9..1c4357d 100644
--- a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/BaseActivator.java
+++ b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/BaseActivator.java
@@ -46,7 +46,6 @@
 
     protected ExecutorService executor = new ThreadPoolExecutor(0, 1, 0L, TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<>());
-    private AtomicBoolean scheduled = new AtomicBoolean();
 
     private long schedulerStopTimeout = TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS);
 
@@ -65,28 +64,26 @@
     @Override
     public void start(BundleContext context) throws Exception {
         bundleContext = context;
-        scheduled.set(true);
-        doOpen();
-        scheduled.set(false);
+        synchronized (this) {
+            doOpen();
+        }
+        // if it's a managed service we'll get a configuration update
+        // that will start it, otherwise we do it here manually
         if (managedServiceRegistration == null) {
-            try {
-                doStart();
-            } catch (Exception e) {
-                logger.warn("Error starting activator", e);
-                doStop();
-            }
-        } else {
             reconfigure();
         }
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
-        scheduled.set(true);
-        doClose();
+        synchronized (this) {
+            doClose();
+        }
         executor.shutdown();
         executor.awaitTermination(schedulerStopTimeout, TimeUnit.MILLISECONDS);
-        doStop();
+        synchronized (this) {
+            doStop();
+        }
     }
 
     protected void doOpen() throws Exception {
@@ -218,20 +215,19 @@
     }
 
     protected void reconfigure() {
-        if (scheduled.compareAndSet(false, true)) {
-            executor.submit(this);
-        }
+        executor.submit(this);
     }
 
     @Override
     public void run() {
-        scheduled.set(false);
-        doStop();
-        try {
-            doStart();
-        } catch (Exception e) {
-            logger.warn("Error starting activator", e);
+        synchronized (this) {
             doStop();
+            try {
+                doStart();
+            } catch (Throwable t) {
+                logger.warn("Error (re)starting activator", t);
+                doStop();
+            }
         }
     }