Index: libadblockplus-android/src/org/adblockplus/libadblockplus/android/SingleInstanceEngineProvider.java |
diff --git a/libadblockplus-android/src/org/adblockplus/libadblockplus/android/SingleInstanceEngineProvider.java b/libadblockplus-android/src/org/adblockplus/libadblockplus/android/SingleInstanceEngineProvider.java |
index 4706684fa5327562adc1e54eed3cc42e742fbc5f..465653f553da67cd1b0439e1655546d710ba4506 100644 |
--- a/libadblockplus-android/src/org/adblockplus/libadblockplus/android/SingleInstanceEngineProvider.java |
+++ b/libadblockplus-android/src/org/adblockplus/libadblockplus/android/SingleInstanceEngineProvider.java |
@@ -58,6 +58,7 @@ public class SingleInstanceEngineProvider implements AdblockEngineProvider |
new LinkedList<EngineCreatedListener>(); |
private List<EngineDisposedListener> engineDisposedListeners = |
new LinkedList<EngineDisposedListener>(); |
+ private final Object engineLock = new Object(); |
/* |
Simple ARC management for AdblockEngine |
@@ -137,45 +138,48 @@ public class SingleInstanceEngineProvider implements AdblockEngineProvider |
private void createAdblock() |
{ |
- ConnectivityManager connectivityManager = |
- (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
- IsAllowedConnectionCallback isAllowedConnectionCallback = |
- new IsAllowedConnectionCallbackImpl(connectivityManager); |
- |
- Log.d(TAG, "Creating adblock engine ..."); |
- |
- AdblockEngine.Builder builder = AdblockEngine |
- .builder( |
- AdblockEngine.generateAppInfo(context, developmentBuild), |
- basePath) |
- .setIsAllowedConnectionCallback(isAllowedConnectionCallback) |
- .enableElementHiding(true); |
- |
- if (v8IsolateProviderPtr != null) |
+ Log.w(TAG, "Waiting for lock"); |
+ synchronized (engineLock) |
{ |
- builder.useV8IsolateProvider(v8IsolateProviderPtr); |
- } |
+ Log.d(TAG, "Creating adblock engine ..."); |
+ ConnectivityManager connectivityManager = |
+ (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
+ IsAllowedConnectionCallback isAllowedConnectionCallback = |
+ new IsAllowedConnectionCallbackImpl(connectivityManager); |
+ |
+ AdblockEngine.Builder builder = AdblockEngine |
+ .builder( |
+ AdblockEngine.generateAppInfo(context, developmentBuild), |
+ basePath) |
+ .setIsAllowedConnectionCallback(isAllowedConnectionCallback) |
+ .enableElementHiding(true); |
+ |
+ if (v8IsolateProviderPtr != null) |
+ { |
+ builder.useV8IsolateProvider(v8IsolateProviderPtr); |
+ } |
- // if preloaded subscriptions provided |
- if (preloadedPreferenceName != null) |
- { |
- SharedPreferences preloadedSubscriptionsPrefs = context.getSharedPreferences( |
- preloadedPreferenceName, |
- Context.MODE_PRIVATE); |
- builder.preloadSubscriptions( |
- context, |
- urlToResourceIdMap, |
- new AndroidWebRequestResourceWrapper.SharedPrefsStorage(preloadedSubscriptionsPrefs)); |
- } |
+ // if preloaded subscriptions provided |
+ if (preloadedPreferenceName != null) |
+ { |
+ SharedPreferences preloadedSubscriptionsPrefs = context.getSharedPreferences( |
+ preloadedPreferenceName, |
+ Context.MODE_PRIVATE); |
+ builder.preloadSubscriptions( |
+ context, |
+ urlToResourceIdMap, |
+ new AndroidWebRequestResourceWrapper.SharedPrefsStorage(preloadedSubscriptionsPrefs)); |
+ } |
- engine = builder.build(); |
+ engine = builder.build(); |
- Log.d(TAG, "AdblockHelper engine created"); |
+ Log.d(TAG, "AdblockHelper engine created"); |
- // sometimes we need to init AdblockEngine instance, eg. set user settings |
- for (EngineCreatedListener listener : engineCreatedListeners) |
- { |
- listener.onAdblockEngineCreated(engine); |
+ // sometimes we need to init AdblockEngine instance, eg. set user settings |
+ for (EngineCreatedListener listener : engineCreatedListeners) |
+ { |
+ listener.onAdblockEngineCreated(engine); |
+ } |
} |
} |
@@ -202,10 +206,13 @@ public class SingleInstanceEngineProvider implements AdblockEngineProvider |
@Override |
public void run() |
{ |
- createAdblock(); |
+ synchronized (engineLock) |
+ { |
+ createAdblock(); |
- // unlock waiting client thread |
- engineCreated.countDown(); |
+ // unlock waiting client thread |
+ engineCreated.countDown(); |
+ } |
} |
}).start(); |
} |
@@ -268,16 +275,20 @@ public class SingleInstanceEngineProvider implements AdblockEngineProvider |
private void disposeAdblock() |
{ |
- Log.w(TAG, "Disposing adblock engine"); |
+ Log.w(TAG, "Waiting for lock"); |
+ synchronized (engineLock) |
+ { |
+ Log.w(TAG, "Disposing adblock engine"); |
- engine.dispose(); |
- engine = null; |
+ engine.dispose(); |
+ engine = null; |
- // sometimes we need to deinit something after AdblockEngine instance disposed |
- // eg. release user settings |
- for (EngineDisposedListener listener : engineDisposedListeners) |
- { |
- listener.onAdblockEngineDisposed(); |
+ // sometimes we need to deinit something after AdblockEngine instance disposed |
+ // eg. release user settings |
+ for (EngineDisposedListener listener : engineDisposedListeners) |
+ { |
+ listener.onAdblockEngineDisposed(); |
+ } |
} |
} |
@@ -286,4 +297,10 @@ public class SingleInstanceEngineProvider implements AdblockEngineProvider |
{ |
return referenceCounter.get(); |
} |
+ |
+ @Override |
+ public Object getEngineLock() |
+ { |
+ return engineLock; |
+ } |
} |