@@ -175,7 +175,10 @@ public void run()
175175 {
176176 deactivate ();
177177 }
178- activate (holder .getPersistenceManager ());
178+ if (!holder .isActivated ()) {
179+ activate (holder .getPersistenceManager ());
180+ holder .activate ();
181+ }
179182 }
180183 });
181184 }
@@ -197,7 +200,7 @@ public void modifiedService(final ServiceReference<PersistenceManager> reference
197200 this .holders .remove (holder );
198201 this .holders .add (new Holder (reference , holder .getPersistenceManager ()));
199202 Collections .sort (this .holders );
200- if ( holders .get (0 ) == holder && oldHolder .compareTo (holder ) != 0 )
203+ if ( holders .get (0 ) == holder && oldHolder != null && oldHolder .compareTo (holder ) != 0 )
201204 {
202205 this .workerQueue .enqueue (new Runnable ()
203206 {
@@ -206,7 +209,10 @@ public void modifiedService(final ServiceReference<PersistenceManager> reference
206209 public void run ()
207210 {
208211 deactivate ();
209- activate (holder .getPersistenceManager ());
212+ if (!holder .isActivated ()) {
213+ activate (holder .getPersistenceManager ());
214+ holder .activate ();
215+ }
210216 }
211217 });
212218 }
@@ -234,7 +240,11 @@ public void run()
234240 deactivate ();
235241 if ( !holders .isEmpty () )
236242 {
237- activate (holders .get (0 ).getPersistenceManager ());
243+ Holder h = holders .get (0 );
244+ if (!h .isActivated ()) {
245+ activate (h .getPersistenceManager ());
246+ h .activate ();
247+ }
238248 }
239249 }
240250 });
@@ -248,6 +258,9 @@ public static final class Holder implements Comparable<Holder>
248258
249259 private final ExtPersistenceManager manager ;
250260
261+ // no need to synchronize, as it's changed only in WorkQueue tasks
262+ private boolean activated ;
263+
251264 public Holder (final ServiceReference <PersistenceManager > ref , final ExtPersistenceManager epm )
252265 {
253266 this .reference = ref ;
@@ -266,6 +279,14 @@ public int compareTo(final Holder o)
266279 return -reference .compareTo (o .reference );
267280 }
268281
282+ public boolean isActivated () {
283+ return activated ;
284+ }
285+
286+ public void activate () {
287+ this .activated = true ;
288+ }
289+
269290 @ Override
270291 public int hashCode ()
271292 {
0 commit comments