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

Commit fd6f631d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Synchronize access to WebViewZygote."

parents 3c050268 89cc5205
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;