mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
1311ec4a42
- Bug 1162692 - Add SpeechSynthesisUtterance.chosenVoiceURI for testing purposes. r=smaug (aa30ec93c) - Bug 1160844 - Only initialize pico tts when not in mochitest and speech synth is enabled. r=smaug (5d00c71e4) - Bug 1167539 - Replace use of NS_ENSURE_* with NS_WARN_IF in dom//webspeech/synth/*. r=smaugmedia (10cb826f8) - Bug 903135 - Multi platform MAR verification build config. r=rstrong (8022418a3) - Bug 1144512 - Add b2g build support for API level 22. r=mwu (a1f9bf473) - Bug 1115480 - Part 1: Implement XPCOM module for mDNSProvider. r=mcmanus (9e2b49f1a) - Bug 1115480 - Part 2: Implement mDNS device provider. r=schien (22ca5283f) - Bug 1115480 - Re-add metadata to the dom/presentation xpcshell.ini that shouldn't have been removed. (e6a5b401e) - Bug 1058551 - Support redirects to data: URIs. r=honza (2ff31ce33) - fix build (b48590cd0) - Bug 1163859: Only update webrtc.debug prefs from gecko thread. r=rjesup (ac0f18cb1) - Bug 1145354: Add SingletonThreadHolder for media/mtransport, and use it for mtransport IPC IO r=bwc (1106b13b5) - Bug 1117586, [e10s] select dropdowns cannot be opened with the keyboard, r=roc (bbf8b8842) - Bug 1152290 - "[e10s] "<select>" doesn't show selected value". r=roc (2a130ec4f) - Bug 1147967 - Remove CreateStackFrameLocation. r=bholley (9ea0b73e0) - Bug 958641 - De-holder nsIXPConnect::WrapNative. r=gabor (c5fe0ee54) - Bug 1142999 - Remove gcc warning about unused typedef. r=ehoogeveen (e0103e01a) - Bug 1145015 - Part 1: Remove IsValidKey() check in MagicGrallocBufferHandle serializer. r=sotaro, r=nical (bb470de06) - Bug 1145015 - Part 2: Add more checking rules for GrallocBuffer allocation. r=sotaro, r=nical (05398af8d) - Bug 1130096 - Convert embedding/components/windowwatcher/ to Gecko style. r=mccr8 (554041661) - Bug 1164977 - Prevent MediaStreamAudioSourceNode from passing null to nsIPrincipal::subsumes. r=padenot (5f95a8ab9) - Bug 1164292 followup: Add 'override' annotations to BasePrincipal & nsSystemPrincipal GetCsp()/SetCsp() methods. rs=ehsan (76e5d2013) - Bug 1164977 - Hoist all the app attribute handling into BasePrincipal. r=gabor (e99bb5617) - Bug 1172483 - Remove erroneous assert. (r=Waldo) (70ce92c09) - Bug 1164977 - Unify subsumes/equals logic on BasePrincipal and reduce duplicated code. r=gabor (4dbf31b45) - Bug 1140472 - Set an async stack when invoking promise handlers. r=bz (f12a5c9f6) - Bug 1164977 - Hoist app attributes into a struct on BasePrincipal and refer to them as 'origin attributes'. r=gabor (85eb810f2) - Bug 1164977 - Hoist attribute serialization into BasePrincipal. r=gabor (ff51a67d1) - Bug 1158133 - Add a way to disable async stacks, and disable by default on mobile platforms. r=bent,jimb (c4954752e) - Bug 1171177 - Remove VAROBJFIX. (r=luke) (5707455e6) - Bug 1165162 - Make requestsync test failures more useful. rpending=baku (5c0a79f07) - Bug 1139254 - Use MockRegistrar in services. r=gps (da61a6fad) - Bug 1165162 - Fix up test_manager.js to use real principals. rpending=ferjm (797ffb5ce) - Bug 1165162 - Stop recreating principals from the message manager. r=smaug (5f5241a6e) - pointer style (c0da0f1a9) - fix some misspatch (e209af9a6) - Bug 1165486 - Replace the PlainObj varobj with NonSyntacticVariablesObject. (r=luke) (2179cf860) - Bug 1171177 - Remove UNQUALIFIED_VAROBJ Shape flags in favor of Class-checking. (r=luke) (93391d13f) - Bug 1165162 - Make OriginAttributes a dictionary, and make it accessible as both a jsval and a canonical string. r=gabor,r=bholley,sr=sicking (0731b0caf)
369 lines
12 KiB
C++
369 lines
12 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* vim: sw=2 ts=8 et :
|
|
*/
|
|
/* 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/. */
|
|
|
|
#include "base/task.h" // for NewRunnableFunction, etc
|
|
#include "base/thread.h" // for Thread
|
|
#include "base/tracked.h" // for FROM_HERE
|
|
#include "mozilla/gfx/Logging.h" // for gfxDebug
|
|
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
#include "mozilla/StaticPtr.h" // for StaticRefPtr
|
|
#include "mozilla/ReentrantMonitor.h" // for ReentrantMonitor, etc
|
|
#include "nsThreadUtils.h" // fo NS_IsMainThread
|
|
|
|
#ifdef MOZ_NUWA_PROCESS
|
|
#include "ipc/Nuwa.h"
|
|
#endif
|
|
|
|
#ifdef MOZ_WIDGET_GONK
|
|
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "SBMChild", ## args)
|
|
#endif
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
using namespace mozilla::gfx;
|
|
|
|
// Singleton
|
|
SharedBufferManagerChild* SharedBufferManagerChild::sSharedBufferManagerChildSingleton = nullptr;
|
|
SharedBufferManagerParent* SharedBufferManagerChild::sSharedBufferManagerParentSingleton = nullptr;
|
|
base::Thread* SharedBufferManagerChild::sSharedBufferManagerChildThread = nullptr;
|
|
|
|
SharedBufferManagerChild::SharedBufferManagerChild()
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
: mBufferMutex("BufferMonitor")
|
|
#endif
|
|
{
|
|
}
|
|
|
|
static bool
|
|
InSharedBufferManagerChildThread()
|
|
{
|
|
return SharedBufferManagerChild::sSharedBufferManagerChildThread->thread_id() == PlatformThread::CurrentId();
|
|
}
|
|
|
|
// dispatched function
|
|
static void
|
|
DeleteSharedBufferManagerSync(ReentrantMonitor *aBarrier, bool *aDone)
|
|
{
|
|
ReentrantMonitorAutoEnter autoMon(*aBarrier);
|
|
|
|
MOZ_ASSERT(InSharedBufferManagerChildThread(),
|
|
"Should be in SharedBufferManagerChild thread.");
|
|
SharedBufferManagerChild::sSharedBufferManagerChildSingleton = nullptr;
|
|
SharedBufferManagerChild::sSharedBufferManagerParentSingleton = nullptr;
|
|
*aDone = true;
|
|
aBarrier->NotifyAll();
|
|
}
|
|
|
|
// dispatched function
|
|
static void
|
|
ConnectSharedBufferManager(SharedBufferManagerChild *child, SharedBufferManagerParent *parent)
|
|
{
|
|
MessageLoop *parentMsgLoop = parent->GetMessageLoop();
|
|
ipc::MessageChannel *parentChannel = parent->GetIPCChannel();
|
|
child->Open(parentChannel, parentMsgLoop, mozilla::ipc::ChildSide);
|
|
}
|
|
|
|
base::Thread*
|
|
SharedBufferManagerChild::GetThread() const
|
|
{
|
|
return sSharedBufferManagerChildThread;
|
|
}
|
|
|
|
SharedBufferManagerChild*
|
|
SharedBufferManagerChild::GetSingleton()
|
|
{
|
|
return sSharedBufferManagerChildSingleton;
|
|
}
|
|
|
|
bool
|
|
SharedBufferManagerChild::IsCreated()
|
|
{
|
|
return GetSingleton() != nullptr;
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::StartUp()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
SharedBufferManagerChild::StartUpOnThread(new base::Thread("BufferMgrChild"));
|
|
}
|
|
|
|
static void
|
|
ConnectSharedBufferManagerInChildProcess(mozilla::ipc::Transport* aTransport,
|
|
base::ProcessId aOtherPid)
|
|
{
|
|
// Bind the IPC channel to the shared buffer manager thread.
|
|
SharedBufferManagerChild::sSharedBufferManagerChildSingleton->Open(aTransport,
|
|
aOtherPid,
|
|
XRE_GetIOMessageLoop(),
|
|
ipc::ChildSide);
|
|
|
|
#ifdef MOZ_NUWA_PROCESS
|
|
if (IsNuwaProcess()) {
|
|
SharedBufferManagerChild::sSharedBufferManagerChildThread
|
|
->message_loop()->PostTask(FROM_HERE,
|
|
NewRunnableFunction(NuwaMarkCurrentThread,
|
|
(void (*)(void *))nullptr,
|
|
(void *)nullptr));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
PSharedBufferManagerChild*
|
|
SharedBufferManagerChild::StartUpInChildProcess(Transport* aTransport,
|
|
base::ProcessId aOtherPid)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
|
|
sSharedBufferManagerChildThread = new base::Thread("BufferMgrChild");
|
|
if (!sSharedBufferManagerChildThread->Start()) {
|
|
return nullptr;
|
|
}
|
|
|
|
sSharedBufferManagerChildSingleton = new SharedBufferManagerChild();
|
|
sSharedBufferManagerChildSingleton->GetMessageLoop()->PostTask(
|
|
FROM_HERE,
|
|
NewRunnableFunction(ConnectSharedBufferManagerInChildProcess,
|
|
aTransport, aOtherPid));
|
|
|
|
return sSharedBufferManagerChildSingleton;
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::ShutDown()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
if (IsCreated()) {
|
|
SharedBufferManagerChild::DestroyManager();
|
|
delete sSharedBufferManagerChildThread;
|
|
sSharedBufferManagerChildThread = nullptr;
|
|
}
|
|
}
|
|
|
|
bool
|
|
SharedBufferManagerChild::StartUpOnThread(base::Thread* aThread)
|
|
{
|
|
MOZ_ASSERT(aThread, "SharedBufferManager needs a thread.");
|
|
if (sSharedBufferManagerChildSingleton != nullptr) {
|
|
return false;
|
|
}
|
|
|
|
sSharedBufferManagerChildThread = aThread;
|
|
if (!aThread->IsRunning()) {
|
|
aThread->Start();
|
|
}
|
|
sSharedBufferManagerChildSingleton = new SharedBufferManagerChild();
|
|
char thrname[128];
|
|
base::snprintf(thrname, 128, "BufMgrParent#%d", base::Process::Current().pid());
|
|
sSharedBufferManagerParentSingleton = new SharedBufferManagerParent(
|
|
nullptr, base::Process::Current().pid(), new base::Thread(thrname));
|
|
sSharedBufferManagerChildSingleton->ConnectAsync(sSharedBufferManagerParentSingleton);
|
|
return true;
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::DestroyManager()
|
|
{
|
|
MOZ_ASSERT(!InSharedBufferManagerChildThread(),
|
|
"This method must not be called in this thread.");
|
|
// ...because we are about to dispatch synchronous messages to the
|
|
// BufferManagerChild thread.
|
|
|
|
if (!IsCreated()) {
|
|
return;
|
|
}
|
|
|
|
ReentrantMonitor barrier("BufferManagerDestroyTask lock");
|
|
ReentrantMonitorAutoEnter autoMon(barrier);
|
|
|
|
bool done = false;
|
|
sSharedBufferManagerChildSingleton->GetMessageLoop()->PostTask(FROM_HERE,
|
|
NewRunnableFunction(&DeleteSharedBufferManagerSync, &barrier, &done));
|
|
while (!done) {
|
|
barrier.Wait();
|
|
}
|
|
|
|
}
|
|
|
|
MessageLoop *
|
|
SharedBufferManagerChild::GetMessageLoop() const
|
|
{
|
|
return sSharedBufferManagerChildThread != nullptr ?
|
|
sSharedBufferManagerChildThread->message_loop() :
|
|
nullptr;
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::ConnectAsync(SharedBufferManagerParent* aParent)
|
|
{
|
|
GetMessageLoop()->PostTask(FROM_HERE, NewRunnableFunction(&ConnectSharedBufferManager,
|
|
this, aParent));
|
|
}
|
|
|
|
// dispatched function
|
|
void
|
|
SharedBufferManagerChild::AllocGrallocBufferSync(const GrallocParam& aParam,
|
|
Monitor* aBarrier,
|
|
bool* aDone)
|
|
{
|
|
MonitorAutoLock autoMon(*aBarrier);
|
|
|
|
sSharedBufferManagerChildSingleton->AllocGrallocBufferNow(aParam.size,
|
|
aParam.format,
|
|
aParam.usage,
|
|
aParam.buffer);
|
|
*aDone = true;
|
|
aBarrier->NotifyAll();
|
|
}
|
|
|
|
// dispatched function
|
|
void
|
|
SharedBufferManagerChild::DeallocGrallocBufferSync(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
{
|
|
SharedBufferManagerChild::sSharedBufferManagerChildSingleton->
|
|
DeallocGrallocBufferNow(aBuffer);
|
|
}
|
|
|
|
bool
|
|
SharedBufferManagerChild::AllocGrallocBuffer(const gfx::IntSize& aSize,
|
|
const uint32_t& aFormat,
|
|
const uint32_t& aUsage,
|
|
mozilla::layers::MaybeMagicGrallocBufferHandle* aBuffer)
|
|
{
|
|
if (aSize.width <= 0 || aSize.height <= 0) {
|
|
gfxDebug() << "Asking for gralloc of invalid size " << aSize.width << "x" << aSize.height;
|
|
return false;
|
|
}
|
|
|
|
if (InSharedBufferManagerChildThread()) {
|
|
return SharedBufferManagerChild::AllocGrallocBufferNow(aSize, aFormat, aUsage, aBuffer);
|
|
}
|
|
|
|
Monitor barrier("AllocSurfaceDescriptorGralloc Lock");
|
|
MonitorAutoLock autoMon(barrier);
|
|
bool done = false;
|
|
|
|
GetMessageLoop()->PostTask(
|
|
FROM_HERE,
|
|
NewRunnableFunction(&AllocGrallocBufferSync,
|
|
GrallocParam(aSize, aFormat, aUsage, aBuffer), &barrier, &done));
|
|
|
|
while (!done) {
|
|
barrier.Wait();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
SharedBufferManagerChild::AllocGrallocBufferNow(const IntSize& aSize,
|
|
const uint32_t& aFormat,
|
|
const uint32_t& aUsage,
|
|
mozilla::layers::MaybeMagicGrallocBufferHandle* aHandle)
|
|
{
|
|
// These are protected functions, we can just assert and ask the caller to test
|
|
MOZ_ASSERT(aSize.width >= 0 && aSize.height >= 0);
|
|
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
mozilla::layers::MaybeMagicGrallocBufferHandle handle;
|
|
if (!SendAllocateGrallocBuffer(aSize, aFormat, aUsage, &handle)) {
|
|
return false;
|
|
}
|
|
if (handle.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
return false;
|
|
}
|
|
*aHandle = handle.get_MagicGrallocBufferHandle().mRef;
|
|
|
|
{
|
|
MutexAutoLock lock(mBufferMutex);
|
|
MOZ_ASSERT(mBuffers.count(handle.get_MagicGrallocBufferHandle().mRef.mKey)==0);
|
|
mBuffers[handle.get_MagicGrallocBufferHandle().mRef.mKey] = handle.get_MagicGrallocBufferHandle().mGraphicBuffer;
|
|
}
|
|
return true;
|
|
#else
|
|
NS_RUNTIMEABORT("No GrallocBuffer for you");
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::DeallocGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
{
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer");
|
|
if (aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if (InSharedBufferManagerChildThread()) {
|
|
return SharedBufferManagerChild::DeallocGrallocBufferNow(aBuffer);
|
|
}
|
|
|
|
GetMessageLoop()->PostTask(FROM_HERE, NewRunnableFunction(&DeallocGrallocBufferSync,
|
|
aBuffer));
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::DeallocGrallocBufferNow(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
{
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer");
|
|
|
|
{
|
|
MutexAutoLock lock(mBufferMutex);
|
|
mBuffers.erase(aBuffer.get_GrallocBufferRef().mKey);
|
|
}
|
|
SendDropGrallocBuffer(aBuffer);
|
|
#else
|
|
NS_RUNTIMEABORT("No GrallocBuffer for you");
|
|
#endif
|
|
}
|
|
|
|
void
|
|
SharedBufferManagerChild::DropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle)
|
|
{
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
int64_t bufferKey = -1;
|
|
if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
bufferKey = aHandle.get_MagicGrallocBufferHandle().mRef.mKey;
|
|
} else if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
bufferKey = aHandle.get_GrallocBufferRef().mKey;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
{
|
|
MutexAutoLock lock(mBufferMutex);
|
|
mBuffers.erase(bufferKey);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
bool SharedBufferManagerChild::RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle)
|
|
{
|
|
DropGrallocBuffer(aHandle);
|
|
return true;
|
|
}
|
|
|
|
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
android::sp<android::GraphicBuffer>
|
|
SharedBufferManagerChild::GetGraphicBuffer(int64_t key)
|
|
{
|
|
MutexAutoLock lock(mBufferMutex);
|
|
if (mBuffers.count(key) == 0) {
|
|
printf_stderr("SharedBufferManagerChild::GetGraphicBuffer -- invalid key");
|
|
return nullptr;
|
|
}
|
|
return mBuffers[key];
|
|
}
|
|
#endif
|
|
|
|
} /* namespace layers */
|
|
} /* namespace mozilla */
|