зеркало из https://github.com/mozilla/gecko-dev.git
Bug 797239 - Defer scheduling prelaunch app until child goes idle. r=cjones, a=blocking-basecamp
This commit is contained in:
Родитель
e08238b617
Коммит
f8fb4173f6
|
@ -470,10 +470,21 @@ ContentChild::AllocPImageBridge(mozilla::ipc::Transport* aTransport,
|
|||
return ImageBridgeChild::StartUpInChildProcess(aTransport, aOtherProcess);
|
||||
}
|
||||
|
||||
static void FirstIdle(void)
|
||||
{
|
||||
ContentChild::GetSingleton()->SendFirstIdle();
|
||||
}
|
||||
|
||||
PBrowserChild*
|
||||
ContentChild::AllocPBrowser(const uint32_t& aChromeFlags,
|
||||
const bool& aIsBrowserElement, const AppId& aApp)
|
||||
{
|
||||
static bool firstIdleTaskPosted = false;
|
||||
if (!firstIdleTaskPosted) {
|
||||
MessageLoop::current()->PostIdleTask(FROM_HERE, NewRunnableFunction(FirstIdle));
|
||||
firstIdleTaskPosted = true;
|
||||
}
|
||||
|
||||
nsRefPtr<TabChild> child =
|
||||
TabChild::Create(aChromeFlags, aIsBrowserElement, aApp.get_uint32_t());
|
||||
// The ref here is released below.
|
||||
|
|
|
@ -227,10 +227,17 @@ ContentParent::MaybeTakePreallocatedAppProcess()
|
|||
{
|
||||
nsRefPtr<ContentParent> process = sPreallocatedAppProcess.get();
|
||||
sPreallocatedAppProcess = nullptr;
|
||||
ScheduleDelayedPreallocateAppProcess();
|
||||
return process.forget();
|
||||
}
|
||||
|
||||
/*static*/ void
|
||||
ContentParent::FirstIdle(void)
|
||||
{
|
||||
// The parent has gone idle for the first time. This would be a good
|
||||
// time to preallocate an app process.
|
||||
ScheduleDelayedPreallocateAppProcess();
|
||||
}
|
||||
|
||||
/*static*/ void
|
||||
ContentParent::StartUp()
|
||||
{
|
||||
|
@ -247,7 +254,10 @@ ContentParent::StartUp()
|
|||
"dom.ipc.processPrelaunch.delayMs", 1000);
|
||||
|
||||
MOZ_ASSERT(!sPreallocateAppProcessTask);
|
||||
ScheduleDelayedPreallocateAppProcess();
|
||||
|
||||
// Let's not slow down the main process initialization. Wait until
|
||||
// the main process goes idle before we preallocate a process
|
||||
MessageLoop::current()->PostIdleTask(FROM_HERE, NewRunnableFunction(FirstIdle));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1003,6 +1013,17 @@ ContentParent::RecvGetShowPasswordSetting(bool* showPassword)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentParent::RecvFirstIdle()
|
||||
{
|
||||
// When the ContentChild goes idle, it sends us a FirstIdle message
|
||||
// which we use as a good time to prelaunch another process. If we
|
||||
// prelaunch any sooner than this, then we'll be competing with the
|
||||
// child process and slowing it down.
|
||||
ScheduleDelayedPreallocateAppProcess();
|
||||
return true;
|
||||
}
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS3(ContentParent,
|
||||
nsIObserver,
|
||||
nsIThreadObserver,
|
||||
|
|
|
@ -144,6 +144,7 @@ private:
|
|||
static void DelayedPreallocateAppProcess();
|
||||
static void ScheduleDelayedPreallocateAppProcess();
|
||||
static already_AddRefed<ContentParent> MaybeTakePreallocatedAppProcess();
|
||||
static void FirstIdle();
|
||||
|
||||
// Hide the raw constructor methods since we don't want client code
|
||||
// using them.
|
||||
|
@ -308,6 +309,8 @@ private:
|
|||
|
||||
virtual bool RecvPrivateDocShellsExist(const bool& aExist);
|
||||
|
||||
virtual bool RecvFirstIdle();
|
||||
|
||||
virtual void ProcessingError(Result what) MOZ_OVERRIDE;
|
||||
|
||||
GeckoChildProcessHost* mSubprocess;
|
||||
|
|
|
@ -346,6 +346,9 @@ parent:
|
|||
// Notify the parent of the presence or absence of private docshells
|
||||
PrivateDocShellsExist(bool aExist);
|
||||
|
||||
// Tell the parent that the child has gone idle for the first time
|
||||
async FirstIdle();
|
||||
|
||||
both:
|
||||
AsyncMessage(nsString aMessage, ClonedMessageData aData);
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче