зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 4 changesets (bug 1319850) for android xpcshell bustage a=backout
Backed out changeset 15b92bb6d810 (bug 1319850) Backed out changeset e31107c3f677 (bug 1319850) Backed out changeset 2a8012945a74 (bug 1319850) Backed out changeset 8717bea884c9 (bug 1319850)
This commit is contained in:
Родитель
079a079cbe
Коммит
0992df4676
|
@ -130,12 +130,6 @@ MessageLoop::MessageLoop(Type type, nsIThread* aThread)
|
|||
pump_ = new mozilla::ipc::MessagePumpForNonMainUIThreads(aThread);
|
||||
return;
|
||||
#endif
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
case TYPE_MOZILLA_ANDROID_UI:
|
||||
MOZ_RELEASE_ASSERT(aThread);
|
||||
pump_ = new mozilla::ipc::MessagePumpForAndroidUI(aThread);
|
||||
return;
|
||||
#endif // defined(MOZ_WIDGET_ANDROID)
|
||||
default:
|
||||
// Create one of Chromium's standard MessageLoop types below.
|
||||
break;
|
||||
|
|
|
@ -180,8 +180,7 @@ public:
|
|||
TYPE_MOZILLA_CHILD,
|
||||
TYPE_MOZILLA_PARENT,
|
||||
TYPE_MOZILLA_NONMAINTHREAD,
|
||||
TYPE_MOZILLA_NONMAINUITHREAD,
|
||||
TYPE_MOZILLA_ANDROID_UI
|
||||
TYPE_MOZILLA_NONMAINUITHREAD
|
||||
};
|
||||
|
||||
// Normally, it is not necessary to instantiate a MessageLoop. Instead, it
|
||||
|
|
|
@ -463,29 +463,3 @@ MessagePumpForNonMainUIThreads::AfterProcessNextEvent(nsIThreadInternal *thread,
|
|||
}
|
||||
|
||||
#endif // XP_WIN
|
||||
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
void
|
||||
MessagePumpForAndroidUI::Run(Delegate* delegate)
|
||||
{
|
||||
MOZ_CRASH("MessagePumpForAndroidUI should never be Run.");
|
||||
}
|
||||
|
||||
void
|
||||
MessagePumpForAndroidUI::Quit()
|
||||
{
|
||||
MOZ_CRASH("MessagePumpForAndroidUI should never be Quit.");
|
||||
}
|
||||
|
||||
void
|
||||
MessagePumpForAndroidUI::ScheduleWork()
|
||||
{
|
||||
MOZ_CRASH("MessagePumpForAndroidUI should never ScheduleWork");
|
||||
}
|
||||
|
||||
void
|
||||
MessagePumpForAndroidUI::ScheduleDelayedWork(const TimeTicks& delayed_work_time)
|
||||
{
|
||||
MOZ_CRASH("MessagePumpForAndroidUI should never ScheduleDelayedWork");
|
||||
}
|
||||
#endif // defined(MOZ_WIDGET_ANDROID)
|
||||
|
|
|
@ -164,43 +164,6 @@ private:
|
|||
};
|
||||
#endif // defined(XP_WIN)
|
||||
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
/*`
|
||||
* The MessagePumpForAndroidUI exists to enable IPDL in the Android UI thread. The Android
|
||||
* UI thread event loop is controlled by Android. This prevents running an existing
|
||||
* MessagePump implementation in the Android UI thread. In order to enable IPDL on the
|
||||
* Android UI thread it is necessary to have a non-looping MessagePump. This class enables
|
||||
* forwarding of nsIRunnables from MessageLoop::PostTask_Helper to the registered
|
||||
* nsIEventTarget with out the need to control the event loop. The only member function
|
||||
* that should be invoked is GetXPCOMThread. All other member functions will invoke MOZ_CRASH
|
||||
*/
|
||||
class MessagePumpForAndroidUI : public base::MessagePump {
|
||||
|
||||
public:
|
||||
MessagePumpForAndroidUI(nsIEventTarget* aEventTarget)
|
||||
: mEventTarget(aEventTarget)
|
||||
{ }
|
||||
|
||||
virtual void Run(Delegate* delegate);
|
||||
virtual void Quit();
|
||||
virtual void ScheduleWork();
|
||||
virtual void ScheduleDelayedWork(const base::TimeTicks& delayed_work_time);
|
||||
virtual nsIEventTarget* GetXPCOMThread()
|
||||
{
|
||||
return mEventTarget;
|
||||
}
|
||||
|
||||
private:
|
||||
~MessagePumpForAndroidUI()
|
||||
{ }
|
||||
MessagePumpForAndroidUI()
|
||||
{ }
|
||||
|
||||
nsIEventTarget* mEventTarget;
|
||||
};
|
||||
#endif // defined(MOZ_WIDGET_ANDROID)
|
||||
|
||||
|
||||
} /* namespace ipc */
|
||||
} /* namespace mozilla */
|
||||
|
||||
|
|
|
@ -999,12 +999,12 @@ class AndroidBridge::DelayedTask
|
|||
using TimeDuration = mozilla::TimeDuration;
|
||||
|
||||
public:
|
||||
DelayedTask(already_AddRefed<nsIRunnable> aTask)
|
||||
DelayedTask(already_AddRefed<Runnable> aTask)
|
||||
: mTask(aTask)
|
||||
, mRunTime() // Null timestamp representing no delay.
|
||||
{}
|
||||
|
||||
DelayedTask(already_AddRefed<nsIRunnable> aTask, int aDelayMs)
|
||||
DelayedTask(already_AddRefed<Runnable> aTask, int aDelayMs)
|
||||
: mTask(aTask)
|
||||
, mRunTime(TimeStamp::Now() + TimeDuration::FromMilliseconds(aDelayMs))
|
||||
{}
|
||||
|
@ -1027,19 +1027,19 @@ public:
|
|||
return 0;
|
||||
}
|
||||
|
||||
already_AddRefed<nsIRunnable> TakeTask()
|
||||
already_AddRefed<Runnable> TakeTask()
|
||||
{
|
||||
return mTask.forget();
|
||||
}
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsIRunnable> mTask;
|
||||
RefPtr<Runnable> mTask;
|
||||
const TimeStamp mRunTime;
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
AndroidBridge::PostTaskToUiThread(already_AddRefed<nsIRunnable> aTask, int aDelayMs)
|
||||
AndroidBridge::PostTaskToUiThread(already_AddRefed<Runnable> aTask, int aDelayMs)
|
||||
{
|
||||
// add the new task into the mUiTaskQueue, sorted with
|
||||
// the earliest task first in the queue
|
||||
|
@ -1086,7 +1086,7 @@ AndroidBridge::RunDelayedUiThreadTasks()
|
|||
}
|
||||
|
||||
// Retrieve task before unlocking/running.
|
||||
nsCOMPtr<nsIRunnable> nextTask(mUiTaskQueue[0].TakeTask());
|
||||
RefPtr<Runnable> nextTask(mUiTaskQueue[0].TakeTask());
|
||||
mUiTaskQueue.RemoveElementAt(0);
|
||||
|
||||
// Unlock to allow posting new tasks reentrantly.
|
||||
|
|
|
@ -42,12 +42,16 @@
|
|||
|
||||
class nsPIDOMWindowOuter;
|
||||
|
||||
namespace base {
|
||||
class Thread;
|
||||
} // end namespace base
|
||||
|
||||
typedef void* EGLSurface;
|
||||
class nsIRunnable;
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
class AutoLocalJNIFrame;
|
||||
class Runnable;
|
||||
|
||||
namespace hal {
|
||||
class BatteryInformation;
|
||||
|
@ -235,7 +239,7 @@ private:
|
|||
mozilla::Mutex mUiTaskQueueLock;
|
||||
|
||||
public:
|
||||
void PostTaskToUiThread(already_AddRefed<nsIRunnable> aTask, int aDelayMs);
|
||||
void PostTaskToUiThread(already_AddRefed<Runnable> aTask, int aDelayMs);
|
||||
int64_t RunDelayedUiThreadTasks();
|
||||
};
|
||||
|
||||
|
|
|
@ -1,204 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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 "AndroidBridge.h"
|
||||
#include "base/message_loop.h"
|
||||
#include "mozilla/Monitor.h"
|
||||
#include "mozilla/RefPtr.h"
|
||||
#include "mozilla/StaticPtr.h"
|
||||
#include "nsThread.h"
|
||||
#include "nsThreadManager.h"
|
||||
#include "nsThreadUtils.h"
|
||||
|
||||
using namespace mozilla;
|
||||
|
||||
namespace {
|
||||
|
||||
class AndroidUiThread;
|
||||
|
||||
StaticRefPtr<AndroidUiThread> sThread;
|
||||
static MessageLoop* sMessageLoop;
|
||||
|
||||
/*
|
||||
* The AndroidUiThread is derived from nsThread so that nsIRunnable objects that get
|
||||
* dispatched may be intercepted. Only nsIRunnable objects that need to be synchronously
|
||||
* executed are passed into the nsThread to be queued. All other nsIRunnable object
|
||||
* are immediately dispatched to the Android UI thread via the AndroidBridge.
|
||||
* AndroidUiThread is derived from nsThread instead of being an nsIEventTarget
|
||||
* wrapper that contains an nsThread object because if nsIRunnable objects with a
|
||||
* delay were dispatch directly to an nsThread object, such as obtained from
|
||||
* nsThreadManager::GetCurrentThread(), the nsIRunnable could get stuck in the
|
||||
* nsThread nsIRunnable queue. This is due to the fact that Android controls the
|
||||
* event loop in the Android UI thread and has no knowledge of when the nsThread
|
||||
* needs to be drained.
|
||||
*/
|
||||
|
||||
class AndroidUiThread : public nsThread
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
AndroidUiThread() : nsThread(nsThread::NOT_MAIN_THREAD, 0)
|
||||
{}
|
||||
|
||||
nsresult Dispatch(already_AddRefed<nsIRunnable> aEvent, uint32_t aFlags) override;
|
||||
nsresult DelayedDispatch(already_AddRefed<nsIRunnable> aEvent, uint32_t aDelayMs) override;
|
||||
|
||||
private:
|
||||
~AndroidUiThread()
|
||||
{}
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED0(AndroidUiThread, nsThread)
|
||||
|
||||
NS_IMETHODIMP
|
||||
AndroidUiThread::Dispatch(already_AddRefed<nsIRunnable> aEvent, uint32_t aFlags)
|
||||
{
|
||||
if (aFlags & NS_DISPATCH_SYNC) {
|
||||
return nsThread::Dispatch(Move(aEvent), aFlags);
|
||||
} else {
|
||||
AndroidBridge::Bridge()->PostTaskToUiThread(Move(aEvent), 0);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
AndroidUiThread::DelayedDispatch(already_AddRefed<nsIRunnable> aEvent, uint32_t aDelayMs)
|
||||
{
|
||||
AndroidBridge::Bridge()->PostTaskToUiThread(Move(aEvent), aDelayMs);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
PumpEvents() {
|
||||
NS_ProcessPendingEvents(sThread.get());
|
||||
}
|
||||
|
||||
class ThreadObserver : public nsIThreadObserver
|
||||
{
|
||||
public:
|
||||
NS_DECL_THREADSAFE_ISUPPORTS
|
||||
NS_DECL_NSITHREADOBSERVER
|
||||
|
||||
ThreadObserver()
|
||||
{}
|
||||
|
||||
private:
|
||||
virtual ~ThreadObserver()
|
||||
{}
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(ThreadObserver, nsIThreadObserver)
|
||||
|
||||
NS_IMETHODIMP
|
||||
ThreadObserver::OnDispatchedEvent(nsIThreadInternal *thread)
|
||||
{
|
||||
AndroidBridge::Bridge()->PostTaskToUiThread(NS_NewRunnableFunction(&PumpEvents), 0);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ThreadObserver::OnProcessNextEvent(nsIThreadInternal *thread, bool mayWait)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ThreadObserver::AfterProcessNextEvent(nsIThreadInternal *thread, bool eventWasProcessed)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
class CreateOnUiThread : public Runnable {
|
||||
public:
|
||||
CreateOnUiThread() : mCreated(false), mThreadCreationMonitor("AndroidUiThreadCreationLock")
|
||||
{}
|
||||
|
||||
NS_IMETHOD Run() override {
|
||||
MonitorAutoLock lock(mThreadCreationMonitor);
|
||||
|
||||
sThread = new AndroidUiThread();
|
||||
sThread->InitCurrentThread();
|
||||
sThread->SetObserver(new ThreadObserver());
|
||||
sMessageLoop = new MessageLoop(MessageLoop::TYPE_MOZILLA_ANDROID_UI, sThread.get());
|
||||
mCreated = true;
|
||||
lock.NotifyAll();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void WaitForCreation()
|
||||
{
|
||||
MonitorAutoLock lock(mThreadCreationMonitor);
|
||||
while (!mCreated) {
|
||||
lock.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool mCreated;
|
||||
Monitor mThreadCreationMonitor;
|
||||
};
|
||||
|
||||
class DestroyOnUiThread : public Runnable {
|
||||
public:
|
||||
DestroyOnUiThread() : mDestroyed(false), mThreadDestructionMonitor("AndroidUiThreadCreationLock")
|
||||
{}
|
||||
|
||||
NS_IMETHOD Run() override {
|
||||
MonitorAutoLock lock(mThreadDestructionMonitor);
|
||||
|
||||
delete sMessageLoop;
|
||||
sMessageLoop = nullptr;
|
||||
MOZ_ASSERT(sThread);
|
||||
nsThreadManager::get().UnregisterCurrentThread(*sThread);
|
||||
sThread = nullptr;
|
||||
mDestroyed = true;
|
||||
lock.NotifyAll();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void WaitForDestruction()
|
||||
{
|
||||
MonitorAutoLock lock(mThreadDestructionMonitor);
|
||||
while (!mDestroyed) {
|
||||
lock.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool mDestroyed;
|
||||
Monitor mThreadDestructionMonitor;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
void
|
||||
CreateAndroidUiThread()
|
||||
{
|
||||
MOZ_ASSERT(!sThread);
|
||||
RefPtr<CreateOnUiThread> runnable = new CreateOnUiThread;
|
||||
AndroidBridge::Bridge()->PostTaskToUiThread(do_AddRef(runnable), 0);
|
||||
runnable->WaitForCreation();
|
||||
}
|
||||
|
||||
void
|
||||
DestroyAndroidUiThread()
|
||||
{
|
||||
MOZ_ASSERT(sThread);
|
||||
RefPtr<DestroyOnUiThread> runnable = new DestroyOnUiThread;
|
||||
// Insure the Android bridge has not already been deconstructed.
|
||||
MOZ_ASSERT(AndroidBridge::Bridge() != nullptr);
|
||||
AndroidBridge::Bridge()->PostTaskToUiThread(do_AddRef(runnable), 0);
|
||||
runnable->WaitForDestruction();
|
||||
}
|
||||
|
||||
MessageLoop*
|
||||
GetAndroidUiThreadMessageLoop()
|
||||
{
|
||||
return sMessageLoop;
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
|
@ -1,20 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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 AndroidUiThread_h__
|
||||
#define AndroidUiThread_h__
|
||||
|
||||
class MessageLoop;
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
void CreateAndroidUiThread();
|
||||
void DestroyAndroidUiThread();
|
||||
|
||||
MessageLoop* GetAndroidUiThreadMessageLoop();
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // AndroidUiThread_h__
|
|
@ -36,7 +36,6 @@ UNIFIED_SOURCES += [
|
|||
'AndroidJavaWrappers.cpp',
|
||||
'AndroidJNI.cpp',
|
||||
'AndroidJNIWrapper.cpp',
|
||||
'AndroidUiThread.cpp',
|
||||
'ANRReporter.cpp',
|
||||
'EventDispatcher.cpp',
|
||||
'GeneratedJNIWrappers.cpp',
|
||||
|
@ -65,7 +64,6 @@ LOCAL_INCLUDES += [
|
|||
'/netwerk/base',
|
||||
'/netwerk/cache',
|
||||
'/widget',
|
||||
'/xpcom/threads',
|
||||
]
|
||||
|
||||
CXXFLAGS += ['-Wno-error=shadow']
|
||||
|
|
|
@ -61,7 +61,6 @@
|
|||
#endif
|
||||
|
||||
#include "AndroidAlerts.h"
|
||||
#include "AndroidUiThread.h"
|
||||
#include "ANRReporter.h"
|
||||
#include "GeckoBatteryManager.h"
|
||||
#include "GeckoNetworkManager.h"
|
||||
|
@ -396,8 +395,6 @@ nsAppShell::nsAppShell()
|
|||
}
|
||||
|
||||
java::GeckoThread::SetState(java::GeckoThread::State::JNI_READY());
|
||||
|
||||
CreateAndroidUiThread();
|
||||
}
|
||||
|
||||
sPowerManagerService = do_GetService(POWERMANAGERSERVICE_CONTRACTID);
|
||||
|
@ -411,8 +408,6 @@ nsAppShell::nsAppShell()
|
|||
|
||||
nsAppShell::~nsAppShell()
|
||||
{
|
||||
DestroyAndroidUiThread();
|
||||
|
||||
{
|
||||
MutexAutoLock lock(*sAppShellLock);
|
||||
sAppShell = nullptr;
|
||||
|
|
|
@ -73,7 +73,6 @@ using mozilla::Unused;
|
|||
|
||||
#include "AndroidBridge.h"
|
||||
#include "AndroidBridgeUtilities.h"
|
||||
#include "AndroidUiThread.h"
|
||||
#include "android_npapi.h"
|
||||
#include "FennecJNINatives.h"
|
||||
#include "GeneratedJNINatives.h"
|
||||
|
@ -3561,7 +3560,7 @@ nsWindow::NeedsPaint()
|
|||
void
|
||||
nsWindow::ConfigureAPZControllerThread()
|
||||
{
|
||||
APZThreadUtils::SetControllerThread(mozilla::GetAndroidUiThreadMessageLoop());
|
||||
APZThreadUtils::SetControllerThread(nullptr);
|
||||
}
|
||||
|
||||
already_AddRefed<GeckoContentController>
|
||||
|
|
Загрузка…
Ссылка в новой задаче