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

Commit c8111e07 authored by Robert Sesek's avatar Robert Sesek Committed by android-build-merger
Browse files

Merge "Synchronize access to WebViewZygote."

am: fd6f631d

Change-Id: I20eaaf40b2ed060caf3685f229005c3e78f29d19
parents bb8f1cd9 fd6f631d
Loading
Loading
Loading
Loading
+77 −40
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import android.os.ZygoteProcess;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.annotations.GuardedBy;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -38,33 +40,59 @@ public class WebViewZygote {
    private static final String WEBVIEW_ZYGOTE_SERVICE_32 = "webview_zygote32";
    private static final String WEBVIEW_ZYGOTE_SERVICE_64 = "webview_zygote64";

    /**
     * Lock object that protects all other static members.
     */
    private static final Object sLock = new Object();

    /**
     * Instance that maintains the socket connection to the zygote. This is null if the zygote
     * is not running or is not connected.
     */
    @GuardedBy("sLock")
    private static ZygoteProcess sZygote;

    /**
     * Information about the selected WebView package. This is set from #onWebViewProviderChanged().
     */
    @GuardedBy("sLock")
    private static PackageInfo sPackage;

    /**
     * Flag for whether multi-process WebView is enabled. If this is false, the zygote
     * will not be started.
     */
    @GuardedBy("sLock")
    private static boolean sMultiprocessEnabled = false;

    public static ZygoteProcess getProcess() {
        connectToZygoteIfNeeded();
        synchronized (sLock) {
            connectToZygoteIfNeededLocked();
            return sZygote;
        }
    }

    public static String getPackageName() {
        synchronized (sLock) {
            return sPackage.packageName;
        }
    }

    public static boolean isMultiprocessEnabled() {
        synchronized (sLock) {
            return sMultiprocessEnabled && sPackage != null;
        }
    }

    public static void setMultiprocessEnabled(boolean enabled) {
        synchronized (sLock) {
            sMultiprocessEnabled = enabled;

            // When toggling between multi-process being on/off, start or stop the
            // service. If it is enabled and the zygote is not yet started, bring up the service.
            // Otherwise, bring down the service. The name may be null if the package
            // information has not yet been resolved.
        final String serviceName = getServiceName();
            final String serviceName = getServiceNameLocked();
            if (serviceName == null) return;

            if (enabled && sZygote == null) {
@@ -74,8 +102,11 @@ public class WebViewZygote {
                sZygote = null;
            }
        }
    }

    public static void onWebViewProviderChanged(PackageInfo packageInfo) {
        String serviceName;
        synchronized (sLock) {
            sPackage = packageInfo;

            // If multi-process is not enabled, then do not start the zygote service.
@@ -83,11 +114,14 @@ public class WebViewZygote {
                return;
            }

        final String serviceName = getServiceName();
            serviceName = getServiceNameLocked();
            sZygote = null;

            // The service may enter the RUNNING state before it opens the socket,
            // so connectToZygoteIfNeededLocked() may still fail.
            if (SystemService.isStopped(serviceName)) {
                SystemService.start(serviceName);
        } else if (sZygote != null) {
            } else {
                SystemService.restart(serviceName);
            }

@@ -98,10 +132,12 @@ public class WebViewZygote {
                return;
            }

        connectToZygoteIfNeeded();
            connectToZygoteIfNeededLocked();
        }
    }

    private static String getServiceName() {
    @GuardedBy("sLock")
    private static String getServiceNameLocked() {
        if (sPackage == null)
            return null;

@@ -113,7 +149,8 @@ public class WebViewZygote {
        return WEBVIEW_ZYGOTE_SERVICE_32;
    }

    private static void connectToZygoteIfNeeded() {
    @GuardedBy("sLock")
    private static void connectToZygoteIfNeededLocked() {
        if (sZygote != null)
            return;

@@ -122,7 +159,7 @@ public class WebViewZygote {
            return;
        }

        final String serviceName = getServiceName();
        final String serviceName = getServiceNameLocked();
        if (!SystemService.isRunning(serviceName)) {
            Log.e(LOGTAG, serviceName + " is not running");
            return;