Skip to content

Instantly share code, notes, and snippets.

@kmaglione
Created July 4, 2018 05:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kmaglione/baffeb98c9a38260cf334a2c243a8637 to your computer and use it in GitHub Desktop.
Save kmaglione/baffeb98c9a38260cf334a2c243a8637 to your computer and use it in GitHub Desktop.
changeset: 491683:d925c6ac67d2
user: Kris Maglione <maglione.k@gmail.com>
date: Mon Jul 02 15:01:25 2018 -0700
files: mozglue/android/APKOpen.cpp toolkit/xre/Bootstrap.cpp toolkit/xre/Bootstrap.h toolkit/xre/nsEmbedFunctions.cpp xpcom/build/nsXULAppAPI.h
description:
Bug 1471025: Part 3a - Refactor Android shared FD API to require fewer modifications per change. r?jld
Adding or removing an FD from this API currently requires changes in about a
half dozen places. Ignoring the Java side of things. This patch changes the
API to pass a struct, rather than additional arguments for each FD, so that
adding and removing FDs only requires changing one declaration, and the two
call sites that add and comsume the FDs.
diff -r e4b1db36c845 -r d925c6ac67d2 mozglue/android/APKOpen.cpp
--- mozglue/android/APKOpen.cpp Sun Jul 01 18:28:31 2018 -0700
+++ mozglue/android/APKOpen.cpp Mon Jul 02 15:01:25 2018 -0700
@@ -408,7 +408,7 @@ Java_org_mozilla_gecko_mozglue_GeckoLoad
gBootstrap->GeckoStart(jenv, argv, argc, sAppData);
ElfLoader::Singleton.ExpectShutdown(true);
} else {
- gBootstrap->XRE_SetAndroidChildFds(jenv, prefsFd, ipcFd, crashFd, crashAnnotationFd);
+ gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, ipcFd, crashFd, crashAnnotationFd });
gBootstrap->XRE_SetProcessType(argv[argc - 1]);
XREChildData childData;
diff -r e4b1db36c845 -r d925c6ac67d2 toolkit/xre/Bootstrap.cpp
--- toolkit/xre/Bootstrap.cpp Sun Jul 01 18:28:31 2018 -0700
+++ toolkit/xre/Bootstrap.cpp Mon Jul 02 15:01:25 2018 -0700
@@ -78,8 +78,8 @@ public:
::GeckoStart(aEnv, argv, argc, aAppData);
}
- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) override {
- ::XRE_SetAndroidChildFds(aEnv, aPrefsFd, aIPCFd, aCrashFd, aCrashAnnotationFd);
+ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, const XRE_AndroidChildFds& aFds) override {
+ ::XRE_SetAndroidChildFds(aEnv, aFds);
}
#endif
diff -r e4b1db36c845 -r d925c6ac67d2 toolkit/xre/Bootstrap.h
--- toolkit/xre/Bootstrap.h Sun Jul 01 18:28:31 2018 -0700
+++ toolkit/xre/Bootstrap.h Mon Jul 02 15:01:25 2018 -0700
@@ -113,7 +113,7 @@ public:
#ifdef MOZ_WIDGET_ANDROID
virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc, const StaticXREAppData& aAppData) = 0;
- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) = 0;
+ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, const XRE_AndroidChildFds& fds) = 0;
#endif
#ifdef LIBFUZZER
diff -r e4b1db36c845 -r d925c6ac67d2 toolkit/xre/nsEmbedFunctions.cpp
--- toolkit/xre/nsEmbedFunctions.cpp Sun Jul 01 18:28:31 2018 -0700
+++ toolkit/xre/nsEmbedFunctions.cpp Mon Jul 02 15:01:25 2018 -0700
@@ -244,13 +244,13 @@ GeckoProcessType sChildProcessType = Gec
#if defined(MOZ_WIDGET_ANDROID)
void
-XRE_SetAndroidChildFds (JNIEnv* env, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd)
+XRE_SetAndroidChildFds (JNIEnv* env, const XRE_AndroidChildFds& fds)
{
mozilla::jni::SetGeckoThreadEnv(env);
- mozilla::dom::SetPrefsFd(prefsFd);
- IPC::Channel::SetClientChannelFd(ipcFd);
- CrashReporter::SetNotificationPipeForChild(crashFd);
- CrashReporter::SetCrashAnnotationPipeForChild(crashAnnotationFd);
+ mozilla::dom::SetPrefsFd(fds.mPrefsFd);
+ IPC::Channel::SetClientChannelFd(fds.mIpcFd);
+ CrashReporter::SetNotificationPipeForChild(fds.mCrashFd);
+ CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd);
}
#endif // defined(MOZ_WIDGET_ANDROID)
diff -r e4b1db36c845 -r d925c6ac67d2 xpcom/build/nsXULAppAPI.h
--- xpcom/build/nsXULAppAPI.h Sun Jul 01 18:28:31 2018 -0700
+++ xpcom/build/nsXULAppAPI.h Mon Jul 02 15:01:25 2018 -0700
@@ -397,8 +397,16 @@ XRE_API(const char*,
XRE_ChildProcessTypeToString, (GeckoProcessType aProcessType))
#if defined(MOZ_WIDGET_ANDROID)
+struct XRE_AndroidChildFds
+{
+ int mPrefsFd;
+ int mIpcFd;
+ int mCrashFd;
+ int mCrashAnnotationFd;
+};
+
XRE_API(void,
- XRE_SetAndroidChildFds, (JNIEnv* env, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd))
+ XRE_SetAndroidChildFds, (JNIEnv* env, const XRE_AndroidChildFds& fds))
#endif // defined(MOZ_WIDGET_ANDROID)
XRE_API(void,
changeset: 491685:f76a12de3579
user: Kris Maglione <maglione.k@gmail.com>
date: Mon Jul 02 15:17:48 2018 -0700
files: dom/ipc/ContentProcess.cpp dom/ipc/ContentProcess.h ipc/glue/GeckoChildProcessHost.cpp mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java mozglue/android/APKOpen.cpp toolkit/xre/nsEmbedFunctions.cpp xpcom/build/nsXULAppAPI.h
description:
Bug 1471025: Part 3c - Also pass the shared preference map handle to Android content processes. r?jld
diff -r 65258f43e3a1 -r f76a12de3579 dom/ipc/ContentProcess.cpp
--- dom/ipc/ContentProcess.cpp Mon Jul 02 15:40:38 2018 -0700
+++ dom/ipc/ContentProcess.cpp Mon Jul 02 15:17:48 2018 -0700
@@ -83,12 +83,19 @@ SetUpSandboxEnvironment()
#ifdef ANDROID
static int gPrefsFd = -1;
+static int gPrefMapFd = -1;
void
SetPrefsFd(int aFd)
{
gPrefsFd = aFd;
}
+
+void
+SetPrefMapFd(int aFd)
+{
+ gPrefMapFd = aFd;
+}
#endif
bool
@@ -229,6 +236,9 @@ ContentProcess::Init(int aArgc, char* aA
// Android is different; get the FD via gPrefsFd instead of a fixed fd.
MOZ_RELEASE_ASSERT(gPrefsFd != -1);
prefsHandle = Some(base::FileDescriptor(gPrefsFd, /* auto_close */ true));
+
+ FileDescriptor::UniquePlatformHandle handle(gPrefMapFd);
+ prefMapHandle.emplace(handle.get());
#elif XP_UNIX
prefsHandle = Some(base::FileDescriptor(kPrefsFileDescriptor,
/* auto_close */ true));
diff -r 65258f43e3a1 -r f76a12de3579 dom/ipc/ContentProcess.h
--- dom/ipc/ContentProcess.h Mon Jul 02 15:40:38 2018 -0700
+++ dom/ipc/ContentProcess.h Mon Jul 02 15:17:48 2018 -0700
@@ -50,8 +50,9 @@ private:
};
#ifdef ANDROID
-// Android doesn't use -prefsHandle, it gets that FD another way.
+// Android doesn't use -prefsHandle, it gets that FDs another way.
void SetPrefsFd(int aFd);
+void SetPrefMapFd(int aFd);
#endif
} // namespace dom
diff -r 65258f43e3a1 -r f76a12de3579 ipc/glue/GeckoChildProcessHost.cpp
--- ipc/glue/GeckoChildProcessHost.cpp Mon Jul 02 15:40:38 2018 -0700
+++ ipc/glue/GeckoChildProcessHost.cpp Mon Jul 02 15:17:48 2018 -0700
@@ -1253,18 +1253,19 @@ GeckoChildProcessHost::LaunchAndroidServ
// which they append to fds_to_remap. There must be a better way to do it.
// See bug 1440207.
int32_t prefsFd = fds_to_remap[0].first;
- int32_t ipcFd = fds_to_remap[1].first;
+ int32_t prefMapFd = fds_to_remap[1].first;
+ int32_t ipcFd = fds_to_remap[2].first;
int32_t crashFd = -1;
int32_t crashAnnotationFd = -1;
- if (fds_to_remap.size() == 3) {
- crashAnnotationFd = fds_to_remap[2].first;
- }
if (fds_to_remap.size() == 4) {
- crashFd = fds_to_remap[2].first;
crashAnnotationFd = fds_to_remap[3].first;
}
+ if (fds_to_remap.size() == 5) {
+ crashFd = fds_to_remap[3].first;
+ crashAnnotationFd = fds_to_remap[4].first;
+ }
- int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, ipcFd, crashFd, crashAnnotationFd);
+ int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd);
if (process_handle) {
*process_handle = handle;
diff -r 65258f43e3a1 -r f76a12de3579 mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl
--- mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl Mon Jul 02 15:40:38 2018 -0700
+++ mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl Mon Jul 02 15:17:48 2018 -0700
@@ -12,7 +12,8 @@ import android.os.ParcelFileDescriptor;
interface IChildProcess {
int getPid();
boolean start(in IProcessManager procMan, in String[] args, in Bundle extras, int flags,
- in ParcelFileDescriptor prefsPfd, in ParcelFileDescriptor ipcPfd,
+ in ParcelFileDescriptor prefsPfd, in ParcelFileDescriptor prefMapPfd,
+ in ParcelFileDescriptor ipcPfd,
in ParcelFileDescriptor crashReporterPfd,
in ParcelFileDescriptor crashAnnotationPfd);
diff -r 65258f43e3a1 -r f76a12de3579 mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java
--- mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java Mon Jul 02 15:40:38 2018 -0700
+++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java Mon Jul 02 15:17:48 2018 -0700
@@ -132,6 +132,7 @@ public class GeckoThread extends Thread
/* package */ static final String EXTRA_ARGS = "args";
private static final String EXTRA_PREFS_FD = "prefsFd";
+ private static final String EXTRA_PREF_MAP_FD = "prefMapFd";
private static final String EXTRA_IPC_FD = "ipcFd";
private static final String EXTRA_CRASH_FD = "crashFd";
private static final String EXTRA_CRASH_ANNOTATION_FD = "crashAnnotationFd";
@@ -153,7 +154,8 @@ public class GeckoThread extends Thread
private synchronized boolean init(final GeckoProfile profile, final String[] args,
final Bundle extras, final int flags,
- final int prefsFd, final int ipcFd,
+ final int prefsFd, final int prefMapFd,
+ final int ipcFd,
final int crashFd,
final int crashAnnotationFd) {
ThreadUtils.assertOnUiThread();
@@ -169,6 +171,7 @@ public class GeckoThread extends Thread
mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3);
mExtras.putInt(EXTRA_PREFS_FD, prefsFd);
+ mExtras.putInt(EXTRA_PREF_MAP_FD, prefMapFd);
mExtras.putInt(EXTRA_IPC_FD, ipcFd);
mExtras.putInt(EXTRA_CRASH_FD, crashFd);
mExtras.putInt(EXTRA_CRASH_ANNOTATION_FD, crashAnnotationFd);
@@ -181,18 +184,20 @@ public class GeckoThread extends Thread
public static boolean initMainProcess(final GeckoProfile profile, final String[] args,
final Bundle extras, final int flags) {
return INSTANCE.init(profile, args, extras, flags, /* fd */ -1,
- /* fd */ -1, /* fd */ -1, /* fd */ -1);
+ /* fd */ -1, /* fd */ -1, /* fd */ -1,
+ /* fd */ -1);
}
public static boolean initChildProcess(final String[] args,
final Bundle extras,
final int flags,
final int prefsFd,
+ final int prefMapFd,
final int ipcFd,
final int crashFd,
final int crashAnnotationFd) {
return INSTANCE.init(/* profile */ null, args, extras, flags,
- prefsFd, ipcFd, crashFd, crashAnnotationFd);
+ prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd);
}
private static boolean canUseProfile(final Context context, final GeckoProfile profile,
@@ -497,6 +502,7 @@ public class GeckoThread extends Thread
// And go.
GeckoLoader.nativeRun(args,
mExtras.getInt(EXTRA_PREFS_FD, -1),
+ mExtras.getInt(EXTRA_PREF_MAP_FD, -1),
mExtras.getInt(EXTRA_IPC_FD, -1),
mExtras.getInt(EXTRA_CRASH_FD, -1),
mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1));
diff -r 65258f43e3a1 -r f76a12de3579 mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java
--- mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java Mon Jul 02 15:40:38 2018 -0700
+++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java Mon Jul 02 15:17:48 2018 -0700
@@ -456,7 +456,7 @@ public final class GeckoLoader {
public static native boolean verifyCRCs(String apkName);
// These methods are implemented in mozglue/android/APKOpen.cpp
- public static native void nativeRun(String[] args, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd);
+ public static native void nativeRun(String[] args, int prefsFd, int prefMapFd, int ipcFd, int crashFd, int crashAnnotationFd);
private static native void loadGeckoLibsNative(String apkName);
private static native void loadSQLiteLibsNative(String apkName);
private static native void loadNSSLibsNative(String apkName);
diff -r 65258f43e3a1 -r f76a12de3579 mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java
--- mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java Mon Jul 02 15:40:38 2018 -0700
+++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java Mon Jul 02 15:17:48 2018 -0700
@@ -180,9 +180,10 @@ public final class GeckoProcessManager e
@WrapForJNI
private static int start(final String type, final String[] args,
- final int prefsFd, final int ipcFd,
+ final int prefsFd, final int prefMapFd,
+ final int ipcFd,
final int crashFd, final int crashAnnotationFd) {
- return INSTANCE.start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ false);
+ return INSTANCE.start(type, args, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ false);
}
private int filterFlagsForChild(int flags) {
@@ -190,7 +191,8 @@ public final class GeckoProcessManager e
GeckoThread.FLAG_ENABLE_NATIVE_CRASHREPORTER);
}
- private int start(final String type, final String[] args, final int prefsFd,
+ private int start(final String type, final String[] args,
+ final int prefsFd, final int prefMapFd,
final int ipcFd, final int crashFd,
final int crashAnnotationFd, final boolean retry) {
final ChildConnection connection = getConnection(type);
@@ -201,11 +203,13 @@ public final class GeckoProcessManager e
final Bundle extras = GeckoThread.getActiveExtras();
final ParcelFileDescriptor prefsPfd;
+ final ParcelFileDescriptor prefMapPfd;
final ParcelFileDescriptor ipcPfd;
final ParcelFileDescriptor crashPfd;
final ParcelFileDescriptor crashAnnotationPfd;
try {
prefsPfd = ParcelFileDescriptor.fromFd(prefsFd);
+ prefMapPfd = ParcelFileDescriptor.fromFd(prefMapFd);
ipcPfd = ParcelFileDescriptor.fromFd(ipcFd);
crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null;
crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null;
@@ -218,8 +222,8 @@ public final class GeckoProcessManager e
boolean started = false;
try {
- started = child.start(this, args, extras, flags, prefsPfd, ipcPfd, crashPfd,
- crashAnnotationPfd);
+ started = child.start(this, args, extras, flags, prefsPfd, prefMapPfd,
+ ipcPfd, crashPfd, crashAnnotationPfd);
} catch (final RemoteException e) {
}
@@ -230,7 +234,7 @@ public final class GeckoProcessManager e
}
Log.w(LOGTAG, "Attempting to kill running child " + type);
connection.unbind();
- return start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true);
+ return start(type, args, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true);
}
try {
diff -r 65258f43e3a1 -r f76a12de3579 mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java
--- mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java Mon Jul 02 15:40:38 2018 -0700
+++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java Mon Jul 02 15:17:48 2018 -0700
@@ -62,6 +62,7 @@ public class GeckoServiceChildProcess ex
final Bundle extras,
final int flags,
final ParcelFileDescriptor prefsPfd,
+ final ParcelFileDescriptor prefMapPfd,
final ParcelFileDescriptor ipcPfd,
final ParcelFileDescriptor crashReporterPfd,
final ParcelFileDescriptor crashAnnotationPfd) {
@@ -74,6 +75,7 @@ public class GeckoServiceChildProcess ex
}
final int prefsFd = prefsPfd.detachFd();
+ final int prefMapFd = prefMapPfd.detachFd();
final int ipcFd = ipcPfd.detachFd();
final int crashReporterFd = crashReporterPfd != null ?
crashReporterPfd.detachFd() : -1;
@@ -83,8 +85,8 @@ public class GeckoServiceChildProcess ex
ThreadUtils.postToUiThread(new Runnable() {
@Override
public void run() {
- if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, ipcFd, crashReporterFd,
- crashAnnotationFd)) {
+ if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, prefMapFd, ipcFd,
+ crashReporterFd, crashAnnotationFd)) {
GeckoThread.launch();
}
}
diff -r 65258f43e3a1 -r f76a12de3579 mozglue/android/APKOpen.cpp
--- mozglue/android/APKOpen.cpp Mon Jul 02 15:40:38 2018 -0700
+++ mozglue/android/APKOpen.cpp Mon Jul 02 15:17:48 2018 -0700
@@ -393,7 +393,7 @@ FreeArgv(char** argv, int argc)
}
extern "C" APKOPEN_EXPORT void MOZ_JNICALL
-Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd)
+Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int prefsFd, int prefMapFd, int ipcFd, int crashFd, int crashAnnotationFd)
{
int argc = 0;
char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc);
@@ -408,7 +408,7 @@ Java_org_mozilla_gecko_mozglue_GeckoLoad
gBootstrap->GeckoStart(jenv, argv, argc, sAppData);
ElfLoader::Singleton.ExpectShutdown(true);
} else {
- gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, ipcFd, crashFd, crashAnnotationFd });
+ gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, prefsMapFd, ipcFd, crashFd, crashAnnotationFd });
gBootstrap->XRE_SetProcessType(argv[argc - 1]);
XREChildData childData;
diff -r 65258f43e3a1 -r f76a12de3579 toolkit/xre/nsEmbedFunctions.cpp
--- toolkit/xre/nsEmbedFunctions.cpp Mon Jul 02 15:40:38 2018 -0700
+++ toolkit/xre/nsEmbedFunctions.cpp Mon Jul 02 15:17:48 2018 -0700
@@ -248,6 +248,7 @@ XRE_SetAndroidChildFds (JNIEnv* env, con
{
mozilla::jni::SetGeckoThreadEnv(env);
mozilla::dom::SetPrefsFd(fds.mPrefsFd);
+ mozilla::dom::SetPrefMapFd(fds.mPrefMapFd);
IPC::Channel::SetClientChannelFd(fds.mIpcFd);
CrashReporter::SetNotificationPipeForChild(fds.mCrashFd);
CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd);
diff -r 65258f43e3a1 -r f76a12de3579 xpcom/build/nsXULAppAPI.h
--- xpcom/build/nsXULAppAPI.h Mon Jul 02 15:40:38 2018 -0700
+++ xpcom/build/nsXULAppAPI.h Mon Jul 02 15:17:48 2018 -0700
@@ -400,6 +400,7 @@ XRE_API(const char*,
struct XRE_AndroidChildFds
{
int mPrefsFd;
+ int mPrefMapFd;
int mIpcFd;
int mCrashFd;
int mCrashAnnotationFd;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment