Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59375a01 authored by Torne (Richard Coles)'s avatar Torne (Richard Coles)
Browse files

Remove synchronized from static methods in WebView.

ART uses the class object's embedded monitor to protect class
initialization - the same monitor used by "synchronized" applied to
static methods. This can cause deadlock in extremely rare cases of
preemption during WebView code loading.

Remove synchronized from all static methods in WebView, to avoid this
deadlock. In most cases the synchronized is simply unnecessary in the
Chromium-based WebView implementation; in CookieSyncManager we instead
use a separately allocated Lock object to preserve thread safety.

Bug: 27417671
Change-Id: I13049f23fc984b77a3f4c203a5c698858c64abfe
parent 84011de7
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -45242,7 +45242,7 @@ package android.webkit {
    method public static boolean allowFileSchemeCookies();
    method public abstract void flush();
    method public abstract java.lang.String getCookie(java.lang.String);
    method public static synchronized android.webkit.CookieManager getInstance();
    method public static android.webkit.CookieManager getInstance();
    method public abstract boolean hasCookies();
    method public abstract deprecated void removeAllCookie();
    method public abstract void removeAllCookies(android.webkit.ValueCallback<java.lang.Boolean>);
@@ -45257,8 +45257,8 @@ package android.webkit {
  }
  public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
    method public static synchronized android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static synchronized android.webkit.CookieSyncManager getInstance();
    method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static android.webkit.CookieSyncManager getInstance();
    method protected deprecated void syncFromRamToFlash();
    field protected static final java.lang.String LOGTAG = "websync";
    field protected android.webkit.WebViewDatabase mDataBase;
+3 −3
Original line number Diff line number Diff line
@@ -48414,7 +48414,7 @@ package android.webkit {
    method public abstract java.lang.String getCookie(java.lang.String);
    method public abstract java.lang.String getCookie(java.lang.String, boolean);
    method public synchronized java.lang.String getCookie(android.net.WebAddress);
    method public static synchronized android.webkit.CookieManager getInstance();
    method public static android.webkit.CookieManager getInstance();
    method public abstract boolean hasCookies();
    method public abstract boolean hasCookies(boolean);
    method public abstract deprecated void removeAllCookie();
@@ -48431,8 +48431,8 @@ package android.webkit {
  }
  public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
    method public static synchronized android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static synchronized android.webkit.CookieSyncManager getInstance();
    method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static android.webkit.CookieSyncManager getInstance();
    method protected deprecated void syncFromRamToFlash();
    field protected static final java.lang.String LOGTAG = "websync";
    field protected android.webkit.WebViewDatabase mDataBase;
+3 −3
Original line number Diff line number Diff line
@@ -45322,7 +45322,7 @@ package android.webkit {
    method public static boolean allowFileSchemeCookies();
    method public abstract void flush();
    method public abstract java.lang.String getCookie(java.lang.String);
    method public static synchronized android.webkit.CookieManager getInstance();
    method public static android.webkit.CookieManager getInstance();
    method public abstract boolean hasCookies();
    method public abstract deprecated void removeAllCookie();
    method public abstract void removeAllCookies(android.webkit.ValueCallback<java.lang.Boolean>);
@@ -45337,8 +45337,8 @@ package android.webkit {
  }
  public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
    method public static synchronized android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static synchronized android.webkit.CookieSyncManager getInstance();
    method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static android.webkit.CookieSyncManager getInstance();
    method protected deprecated void syncFromRamToFlash();
    field protected static final java.lang.String LOGTAG = "websync";
    field protected android.webkit.WebViewDatabase mDataBase;
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ public abstract class CookieManager {
     *
     * @return the singleton CookieManager instance
     */
    public static synchronized CookieManager getInstance() {
    public static CookieManager getInstance() {
        return WebViewFactory.getProvider().getCookieManager();
    }

+15 −10
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ public final class CookieSyncManager extends WebSyncManager {

    private static CookieSyncManager sRef;
    private static boolean sGetInstanceAllowed = false;
    private static final Object sLock = new Object();

    private CookieSyncManager() {
        super(null, null);
@@ -77,26 +78,30 @@ public final class CookieSyncManager extends WebSyncManager {
     *
     * @return CookieSyncManager
     */
    public static synchronized CookieSyncManager getInstance() {
    public static CookieSyncManager getInstance() {
        synchronized (sLock) {
            checkInstanceIsAllowed();
            if (sRef == null) {
                sRef = new CookieSyncManager();
            }
            return sRef;
        }
    }

    /**
     * Create a singleton CookieSyncManager within a context
     * @param context
     * @return CookieSyncManager
     */
    public static synchronized CookieSyncManager createInstance(Context context) {
    public static CookieSyncManager createInstance(Context context) {
        synchronized (sLock) {
            if (context == null) {
                throw new IllegalArgumentException("Invalid context argument");
            }
            setGetInstanceIsAllowed();
            return getInstance();
        }
    }

    /**
     * sync() forces sync manager to sync now
Loading