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:
Wes Kocher 2016-12-22 18:16:34 -08:00
parent 079a079cbe
commit 0992df4676
11 changed files with 14 additions and 312 deletions

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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 */

View File

@ -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.

View File

@ -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();
};

View File

@ -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

View File

@ -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__

View File

@ -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']

View File

@ -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;

View File

@ -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>