mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-01 08:42:13 +00:00
11b8b5a61b
Backed out changeset a56449ddacc9 (bug 1661364) Backed out changeset fc185ddca53b (bug 1661364) Backed out changeset 99234e013005 (bug 1661364) Backed out changeset eac6bfc4a98d (bug 1661364) Backed out changeset 9cb0e2dc8d8a (bug 1661364) Backed out changeset 37b78e402c23 (bug 1661364) Backed out changeset ae991d4209a7 (bug 1660342)
78 lines
2.8 KiB
C++
78 lines
2.8 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_PreallocatedProcessManager_h
|
|
#define mozilla_PreallocatedProcessManager_h
|
|
|
|
#include "base/basictypes.h"
|
|
#include "mozilla/AlreadyAddRefed.h"
|
|
#include "nsStringFwd.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
class ContentParent;
|
|
} // namespace dom
|
|
|
|
/**
|
|
* This class manages a ContentParent that it starts up ahead of any particular
|
|
* need. You can then call Take() to get this process and use it. Since we
|
|
* already started it up, it should be ready for use faster than if you'd
|
|
* created the process when you needed it.
|
|
*
|
|
* This class watches the dom.ipc.processPrelaunch.enabled pref. If it changes
|
|
* from false to true, it preallocates a process. If it changes from true to
|
|
* false, it kills the preallocated process, if any.
|
|
*
|
|
* We don't expect this pref to flip between true and false in production, but
|
|
* flipping the pref is important for tests.
|
|
*/
|
|
class PreallocatedProcessManagerImpl;
|
|
|
|
class PreallocatedProcessManager final {
|
|
typedef mozilla::dom::ContentParent ContentParent;
|
|
|
|
public:
|
|
static PreallocatedProcessManagerImpl* GetPPMImpl();
|
|
|
|
/**
|
|
* Before first paint we don't want to allocate any processes in the
|
|
* background. To avoid that, the PreallocatedProcessManager won't start up
|
|
* any processes while there is a blocker active.
|
|
*/
|
|
static void AddBlocker(const nsACString& aRemoteType, ContentParent* aParent);
|
|
static void RemoveBlocker(const nsACString& aRemoteType,
|
|
ContentParent* aParent);
|
|
|
|
/**
|
|
* Take the preallocated process, if we have one, or a recycled
|
|
* process cached via Provide(). Currently we only cache
|
|
* DEFAULT_REMOTE_TYPE ('web') processes and only reuse them for that
|
|
* type. If we don't have a process to return (cached or preallocated),
|
|
* this returns null.
|
|
*
|
|
* If we use a preallocated process, it will schedule the start of
|
|
* another on Idle (AllocateOnIdle()).
|
|
*/
|
|
static already_AddRefed<ContentParent> Take(const nsACString& aRemoteType);
|
|
|
|
/**
|
|
* Cache a process (currently only DEFAULT_REMOTE_TYPE) for reuse later
|
|
* via Take(). Returns true if we cached the process, and false if
|
|
* another process is already cached (so the caller knows to destroy it).
|
|
* This takes a reference to the ContentParent if it is cached.
|
|
*/
|
|
static bool Provide(ContentParent* aParent);
|
|
static void Erase(ContentParent* aParent);
|
|
|
|
private:
|
|
PreallocatedProcessManager();
|
|
DISALLOW_EVIL_CONSTRUCTORS(PreallocatedProcessManager);
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // defined mozilla_PreallocatedProcessManager_h
|