forked from mirrors/gecko-dev
Bug 1471025: Part 3c - Also pass the shared preference map handle to Android content processes. r=jld
MozReview-Commit-ID: CTjDzVC9gcD --HG-- extra : intermediate-source : 7c03b7dd00e9675f9ac045ed1ea733eb0486904f extra : absorb_source : c79df6bd9ebbec3454fcca1a81cbfa540ad91a3e extra : source : 38f690f30e78764763bb012045073fa781efa691 extra : histedit_source : 544ff4257f38fae99a800276d06eb0d719882ca2
This commit is contained in:
parent
f071708db7
commit
b744713e4e
11 changed files with 51 additions and 23 deletions
|
|
@ -83,12 +83,19 @@ SetUpSandboxEnvironment()
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
static int gPrefsFd = -1;
|
static int gPrefsFd = -1;
|
||||||
|
static int gPrefMapFd = -1;
|
||||||
|
|
||||||
void
|
void
|
||||||
SetPrefsFd(int aFd)
|
SetPrefsFd(int aFd)
|
||||||
{
|
{
|
||||||
gPrefsFd = aFd;
|
gPrefsFd = aFd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SetPrefMapFd(int aFd)
|
||||||
|
{
|
||||||
|
gPrefMapFd = aFd;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -228,6 +235,9 @@ ContentProcess::Init(int aArgc, char* aArgv[])
|
||||||
// Android is different; get the FD via gPrefsFd instead of a fixed fd.
|
// Android is different; get the FD via gPrefsFd instead of a fixed fd.
|
||||||
MOZ_RELEASE_ASSERT(gPrefsFd != -1);
|
MOZ_RELEASE_ASSERT(gPrefsFd != -1);
|
||||||
prefsHandle = Some(base::FileDescriptor(gPrefsFd, /* auto_close */ true));
|
prefsHandle = Some(base::FileDescriptor(gPrefsFd, /* auto_close */ true));
|
||||||
|
|
||||||
|
FileDescriptor::UniquePlatformHandle handle(gPrefMapFd);
|
||||||
|
prefMapHandle.emplace(handle.get());
|
||||||
#elif XP_UNIX
|
#elif XP_UNIX
|
||||||
prefsHandle = Some(base::FileDescriptor(kPrefsFileDescriptor,
|
prefsHandle = Some(base::FileDescriptor(kPrefsFileDescriptor,
|
||||||
/* auto_close */ true));
|
/* auto_close */ true));
|
||||||
|
|
|
||||||
|
|
@ -50,8 +50,10 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
// Android doesn't use -prefsHandle, it gets that FD another way.
|
// Android doesn't use -prefsHandle or -prefMapHandle. It gets those FDs
|
||||||
|
// another way.
|
||||||
void SetPrefsFd(int aFd);
|
void SetPrefsFd(int aFd);
|
||||||
|
void SetPrefMapFd(int aFd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
|
|
|
||||||
|
|
@ -1242,7 +1242,7 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type,
|
||||||
const base::file_handle_mapping_vector& fds_to_remap,
|
const base::file_handle_mapping_vector& fds_to_remap,
|
||||||
ProcessHandle* process_handle)
|
ProcessHandle* process_handle)
|
||||||
{
|
{
|
||||||
MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 4));
|
MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 5));
|
||||||
JNIEnv* const env = mozilla::jni::GetEnvForThread();
|
JNIEnv* const env = mozilla::jni::GetEnvForThread();
|
||||||
MOZ_ASSERT(env);
|
MOZ_ASSERT(env);
|
||||||
|
|
||||||
|
|
@ -1258,18 +1258,19 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type,
|
||||||
// which they append to fds_to_remap. There must be a better way to do it.
|
// which they append to fds_to_remap. There must be a better way to do it.
|
||||||
// See bug 1440207.
|
// See bug 1440207.
|
||||||
int32_t prefsFd = fds_to_remap[0].first;
|
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 crashFd = -1;
|
||||||
int32_t crashAnnotationFd = -1;
|
int32_t crashAnnotationFd = -1;
|
||||||
if (fds_to_remap.size() == 3) {
|
|
||||||
crashAnnotationFd = fds_to_remap[2].first;
|
|
||||||
}
|
|
||||||
if (fds_to_remap.size() == 4) {
|
if (fds_to_remap.size() == 4) {
|
||||||
crashFd = fds_to_remap[2].first;
|
|
||||||
crashAnnotationFd = fds_to_remap[3].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) {
|
if (process_handle) {
|
||||||
*process_handle = handle;
|
*process_handle = handle;
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ import android.os.ParcelFileDescriptor;
|
||||||
interface IChildProcess {
|
interface IChildProcess {
|
||||||
int getPid();
|
int getPid();
|
||||||
boolean start(in IProcessManager procMan, in String[] args, in Bundle extras, int flags,
|
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 crashReporterPfd,
|
||||||
in ParcelFileDescriptor crashAnnotationPfd);
|
in ParcelFileDescriptor crashAnnotationPfd);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ public class GeckoThread extends Thread {
|
||||||
|
|
||||||
/* package */ static final String EXTRA_ARGS = "args";
|
/* package */ static final String EXTRA_ARGS = "args";
|
||||||
private static final String EXTRA_PREFS_FD = "prefsFd";
|
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_IPC_FD = "ipcFd";
|
||||||
private static final String EXTRA_CRASH_FD = "crashFd";
|
private static final String EXTRA_CRASH_FD = "crashFd";
|
||||||
private static final String EXTRA_CRASH_ANNOTATION_FD = "crashAnnotationFd";
|
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,
|
private synchronized boolean init(final GeckoProfile profile, final String[] args,
|
||||||
final Bundle extras, final int flags,
|
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 crashFd,
|
||||||
final int crashAnnotationFd) {
|
final int crashAnnotationFd) {
|
||||||
ThreadUtils.assertOnUiThread();
|
ThreadUtils.assertOnUiThread();
|
||||||
|
|
@ -169,6 +171,7 @@ public class GeckoThread extends Thread {
|
||||||
|
|
||||||
mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3);
|
mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3);
|
||||||
mExtras.putInt(EXTRA_PREFS_FD, prefsFd);
|
mExtras.putInt(EXTRA_PREFS_FD, prefsFd);
|
||||||
|
mExtras.putInt(EXTRA_PREF_MAP_FD, prefMapFd);
|
||||||
mExtras.putInt(EXTRA_IPC_FD, ipcFd);
|
mExtras.putInt(EXTRA_IPC_FD, ipcFd);
|
||||||
mExtras.putInt(EXTRA_CRASH_FD, crashFd);
|
mExtras.putInt(EXTRA_CRASH_FD, crashFd);
|
||||||
mExtras.putInt(EXTRA_CRASH_ANNOTATION_FD, crashAnnotationFd);
|
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,
|
public static boolean initMainProcess(final GeckoProfile profile, final String[] args,
|
||||||
final Bundle extras, final int flags) {
|
final Bundle extras, final int flags) {
|
||||||
return INSTANCE.init(profile, args, extras, flags, /* fd */ -1,
|
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,
|
public static boolean initChildProcess(final String[] args,
|
||||||
final Bundle extras,
|
final Bundle extras,
|
||||||
final int flags,
|
final int flags,
|
||||||
final int prefsFd,
|
final int prefsFd,
|
||||||
|
final int prefMapFd,
|
||||||
final int ipcFd,
|
final int ipcFd,
|
||||||
final int crashFd,
|
final int crashFd,
|
||||||
final int crashAnnotationFd) {
|
final int crashAnnotationFd) {
|
||||||
return INSTANCE.init(/* profile */ null, args, extras, flags,
|
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,
|
private static boolean canUseProfile(final Context context, final GeckoProfile profile,
|
||||||
|
|
@ -497,6 +502,7 @@ public class GeckoThread extends Thread {
|
||||||
// And go.
|
// And go.
|
||||||
GeckoLoader.nativeRun(args,
|
GeckoLoader.nativeRun(args,
|
||||||
mExtras.getInt(EXTRA_PREFS_FD, -1),
|
mExtras.getInt(EXTRA_PREFS_FD, -1),
|
||||||
|
mExtras.getInt(EXTRA_PREF_MAP_FD, -1),
|
||||||
mExtras.getInt(EXTRA_IPC_FD, -1),
|
mExtras.getInt(EXTRA_IPC_FD, -1),
|
||||||
mExtras.getInt(EXTRA_CRASH_FD, -1),
|
mExtras.getInt(EXTRA_CRASH_FD, -1),
|
||||||
mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1));
|
mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1));
|
||||||
|
|
|
||||||
|
|
@ -456,7 +456,7 @@ public final class GeckoLoader {
|
||||||
public static native boolean verifyCRCs(String apkName);
|
public static native boolean verifyCRCs(String apkName);
|
||||||
|
|
||||||
// These methods are implemented in mozglue/android/APKOpen.cpp
|
// 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 loadGeckoLibsNative(String apkName);
|
||||||
private static native void loadSQLiteLibsNative(String apkName);
|
private static native void loadSQLiteLibsNative(String apkName);
|
||||||
private static native void loadNSSLibsNative(String apkName);
|
private static native void loadNSSLibsNative(String apkName);
|
||||||
|
|
|
||||||
|
|
@ -182,9 +182,10 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
|
||||||
|
|
||||||
@WrapForJNI
|
@WrapForJNI
|
||||||
private static int start(final String type, final String[] args,
|
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) {
|
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) {
|
private int filterFlagsForChild(int flags) {
|
||||||
|
|
@ -192,7 +193,8 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
|
||||||
GeckoThread.FLAG_ENABLE_NATIVE_CRASHREPORTER);
|
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 ipcFd, final int crashFd,
|
||||||
final int crashAnnotationFd, final boolean retry) {
|
final int crashAnnotationFd, final boolean retry) {
|
||||||
final ChildConnection connection = getConnection(type);
|
final ChildConnection connection = getConnection(type);
|
||||||
|
|
@ -203,11 +205,13 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
|
||||||
|
|
||||||
final Bundle extras = GeckoThread.getActiveExtras();
|
final Bundle extras = GeckoThread.getActiveExtras();
|
||||||
final ParcelFileDescriptor prefsPfd;
|
final ParcelFileDescriptor prefsPfd;
|
||||||
|
final ParcelFileDescriptor prefMapPfd;
|
||||||
final ParcelFileDescriptor ipcPfd;
|
final ParcelFileDescriptor ipcPfd;
|
||||||
final ParcelFileDescriptor crashPfd;
|
final ParcelFileDescriptor crashPfd;
|
||||||
final ParcelFileDescriptor crashAnnotationPfd;
|
final ParcelFileDescriptor crashAnnotationPfd;
|
||||||
try {
|
try {
|
||||||
prefsPfd = ParcelFileDescriptor.fromFd(prefsFd);
|
prefsPfd = ParcelFileDescriptor.fromFd(prefsFd);
|
||||||
|
prefMapPfd = ParcelFileDescriptor.fromFd(prefMapFd);
|
||||||
ipcPfd = ParcelFileDescriptor.fromFd(ipcFd);
|
ipcPfd = ParcelFileDescriptor.fromFd(ipcFd);
|
||||||
crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null;
|
crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null;
|
||||||
crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null;
|
crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null;
|
||||||
|
|
@ -220,8 +224,8 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
|
||||||
|
|
||||||
boolean started = false;
|
boolean started = false;
|
||||||
try {
|
try {
|
||||||
started = child.start(this, args, extras, flags, prefsPfd, ipcPfd, crashPfd,
|
started = child.start(this, args, extras, flags, prefsPfd, prefMapPfd,
|
||||||
crashAnnotationPfd);
|
ipcPfd, crashPfd, crashAnnotationPfd);
|
||||||
} catch (final RemoteException e) {
|
} catch (final RemoteException e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -232,7 +236,7 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
|
||||||
}
|
}
|
||||||
Log.w(LOGTAG, "Attempting to kill running child " + type);
|
Log.w(LOGTAG, "Attempting to kill running child " + type);
|
||||||
connection.unbind();
|
connection.unbind();
|
||||||
return start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true);
|
return start(type, args, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ public class GeckoServiceChildProcess extends Service {
|
||||||
final Bundle extras,
|
final Bundle extras,
|
||||||
final int flags,
|
final int flags,
|
||||||
final ParcelFileDescriptor prefsPfd,
|
final ParcelFileDescriptor prefsPfd,
|
||||||
|
final ParcelFileDescriptor prefMapPfd,
|
||||||
final ParcelFileDescriptor ipcPfd,
|
final ParcelFileDescriptor ipcPfd,
|
||||||
final ParcelFileDescriptor crashReporterPfd,
|
final ParcelFileDescriptor crashReporterPfd,
|
||||||
final ParcelFileDescriptor crashAnnotationPfd) {
|
final ParcelFileDescriptor crashAnnotationPfd) {
|
||||||
|
|
@ -74,6 +75,7 @@ public class GeckoServiceChildProcess extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
final int prefsFd = prefsPfd.detachFd();
|
final int prefsFd = prefsPfd.detachFd();
|
||||||
|
final int prefMapFd = prefMapPfd.detachFd();
|
||||||
final int ipcFd = ipcPfd.detachFd();
|
final int ipcFd = ipcPfd.detachFd();
|
||||||
final int crashReporterFd = crashReporterPfd != null ?
|
final int crashReporterFd = crashReporterPfd != null ?
|
||||||
crashReporterPfd.detachFd() : -1;
|
crashReporterPfd.detachFd() : -1;
|
||||||
|
|
@ -83,8 +85,8 @@ public class GeckoServiceChildProcess extends Service {
|
||||||
ThreadUtils.postToUiThread(new Runnable() {
|
ThreadUtils.postToUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, ipcFd, crashReporterFd,
|
if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, prefMapFd, ipcFd,
|
||||||
crashAnnotationFd)) {
|
crashReporterFd, crashAnnotationFd)) {
|
||||||
GeckoThread.launch();
|
GeckoThread.launch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ FreeArgv(char** argv, int argc)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" APKOPEN_EXPORT void MOZ_JNICALL
|
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;
|
int argc = 0;
|
||||||
char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc);
|
char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc);
|
||||||
|
|
@ -408,7 +408,7 @@ Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jo
|
||||||
gBootstrap->GeckoStart(jenv, argv, argc, sAppData);
|
gBootstrap->GeckoStart(jenv, argv, argc, sAppData);
|
||||||
ElfLoader::Singleton.ExpectShutdown(true);
|
ElfLoader::Singleton.ExpectShutdown(true);
|
||||||
} else {
|
} else {
|
||||||
gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, ipcFd, crashFd, crashAnnotationFd });
|
gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd });
|
||||||
gBootstrap->XRE_SetProcessType(argv[argc - 1]);
|
gBootstrap->XRE_SetProcessType(argv[argc - 1]);
|
||||||
|
|
||||||
XREChildData childData;
|
XREChildData childData;
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,7 @@ XRE_SetAndroidChildFds (JNIEnv* env, const XRE_AndroidChildFds& fds)
|
||||||
{
|
{
|
||||||
mozilla::jni::SetGeckoThreadEnv(env);
|
mozilla::jni::SetGeckoThreadEnv(env);
|
||||||
mozilla::dom::SetPrefsFd(fds.mPrefsFd);
|
mozilla::dom::SetPrefsFd(fds.mPrefsFd);
|
||||||
|
mozilla::dom::SetPrefMapFd(fds.mPrefMapFd);
|
||||||
IPC::Channel::SetClientChannelFd(fds.mIpcFd);
|
IPC::Channel::SetClientChannelFd(fds.mIpcFd);
|
||||||
CrashReporter::SetNotificationPipeForChild(fds.mCrashFd);
|
CrashReporter::SetNotificationPipeForChild(fds.mCrashFd);
|
||||||
CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd);
|
CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd);
|
||||||
|
|
|
||||||
|
|
@ -400,6 +400,7 @@ XRE_API(const char*,
|
||||||
struct XRE_AndroidChildFds
|
struct XRE_AndroidChildFds
|
||||||
{
|
{
|
||||||
int mPrefsFd;
|
int mPrefsFd;
|
||||||
|
int mPrefMapFd;
|
||||||
int mIpcFd;
|
int mIpcFd;
|
||||||
int mCrashFd;
|
int mCrashFd;
|
||||||
int mCrashAnnotationFd;
|
int mCrashAnnotationFd;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue