зеркало из https://github.com/mozilla/gecko-dev.git
Bug 903386 - Make all delayed PluginModuleParent tasks revocable. r=aklotz
This commit is contained in:
Родитель
3a6d8a93b7
Коммит
64665d4370
|
@ -493,19 +493,10 @@ PluginModuleParent::TerminateChildProcess(MessageLoop* aMsgLoop)
|
|||
// this must run before the error notification from the channel,
|
||||
// or not at all
|
||||
bool isFromHangUI = aMsgLoop != MessageLoop::current();
|
||||
if (isFromHangUI) {
|
||||
// If we're posting from a different thread we can't create
|
||||
// the task via mTaskFactory
|
||||
aMsgLoop->PostTask(FROM_HERE,
|
||||
NewRunnableMethod(this,
|
||||
&PluginModuleParent::CleanupFromTimeout,
|
||||
isFromHangUI));
|
||||
} else {
|
||||
aMsgLoop->PostTask(
|
||||
FROM_HERE,
|
||||
mTaskFactory.NewRunnableMethod(
|
||||
&PluginModuleParent::CleanupFromTimeout, isFromHangUI));
|
||||
}
|
||||
aMsgLoop->PostTask(
|
||||
FROM_HERE,
|
||||
mTaskFactory.NewRunnableMethod(
|
||||
&PluginModuleParent::CleanupFromTimeout, isFromHangUI));
|
||||
|
||||
if (!KillProcess(OtherProcess(), 1, false))
|
||||
NS_WARNING("failed to kill subprocess!");
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "base/process.h"
|
||||
#include "mozilla/FileUtils.h"
|
||||
#include "mozilla/PluginLibrary.h"
|
||||
#include "mozilla/plugins/ScopedMethodFactory.h"
|
||||
#include "mozilla/plugins/PluginProcessParent.h"
|
||||
#include "mozilla/plugins/PPluginModuleParent.h"
|
||||
#include "npapi.h"
|
||||
|
@ -302,7 +303,7 @@ private:
|
|||
const NPNetscapeFuncs* mNPNIface;
|
||||
nsDataHashtable<nsPtrHashKey<void>, PluginIdentifierParent*> mIdentifiers;
|
||||
nsNPAPIPlugin* mPlugin;
|
||||
ScopedRunnableMethodFactory<PluginModuleParent> mTaskFactory;
|
||||
ScopedMethodFactory<PluginModuleParent> mTaskFactory;
|
||||
nsString mPluginDumpID;
|
||||
nsString mBrowserDumpID;
|
||||
nsString mHangID;
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
/* 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_plugins_ScopedMethodFactory_h
|
||||
#define mozilla_plugins_ScopedMethodFactory_h
|
||||
|
||||
#include <base/task.h>
|
||||
|
||||
/*
|
||||
* This is based on the ScopedRunnableMethodFactory from ipc/chromium/src/base/task.h
|
||||
* Chromiums factories assert if tasks are created and run on different threads,
|
||||
* which is something we need to do in PluginModuleParent (hang UI vs. main thread).
|
||||
* ScopedMethodFactory just provides cancellable tasks that don't assert this.
|
||||
*/
|
||||
|
||||
namespace mozilla {
|
||||
namespace plugins {
|
||||
|
||||
template<class T>
|
||||
class ScopedMethodFactory : public RevocableStore
|
||||
{
|
||||
private:
|
||||
template<class TaskType>
|
||||
class TaskWrapper : public TaskType
|
||||
{
|
||||
public:
|
||||
explicit TaskWrapper(RevocableStore* store) : revocable_(store) { }
|
||||
|
||||
virtual void Run() {
|
||||
if (!revocable_.revoked())
|
||||
TaskType::Run();
|
||||
}
|
||||
|
||||
private:
|
||||
Revocable revocable_;
|
||||
};
|
||||
|
||||
public:
|
||||
explicit ScopedMethodFactory(T* object) : object_(object) { }
|
||||
|
||||
template <class Method>
|
||||
inline Task* NewRunnableMethod(Method method) {
|
||||
typedef TaskWrapper<RunnableMethod<Method, Tuple0> > TaskWrapper;
|
||||
|
||||
TaskWrapper* task = new TaskWrapper(this);
|
||||
task->Init(object_, method, MakeTuple());
|
||||
return task;
|
||||
}
|
||||
|
||||
template <class Method, class A>
|
||||
inline Task* NewRunnableMethod(Method method, const A& a) {
|
||||
typedef TaskWrapper<RunnableMethod<Method, Tuple1<A> > > TaskWrapper;
|
||||
|
||||
TaskWrapper* task = new TaskWrapper(this);
|
||||
task->Init(object_, method, MakeTuple(a));
|
||||
return task;
|
||||
}
|
||||
|
||||
protected:
|
||||
template <class Method, class Params>
|
||||
class RunnableMethod : public Task {
|
||||
public:
|
||||
RunnableMethod() { }
|
||||
|
||||
void Init(T* obj, Method meth, const Params& params) {
|
||||
obj_ = obj;
|
||||
meth_ = meth;
|
||||
params_ = params;
|
||||
}
|
||||
|
||||
virtual void Run() { DispatchToMethod(obj_, meth_, params_); }
|
||||
|
||||
private:
|
||||
T* obj_;
|
||||
Method meth_;
|
||||
Params params_;
|
||||
};
|
||||
|
||||
private:
|
||||
T* object_;
|
||||
};
|
||||
|
||||
} // namespace plugins
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_plugins_ScopedMethodFactory_h
|
|
@ -39,6 +39,7 @@ EXPORTS.mozilla.plugins += [
|
|||
'PluginStreamChild.h',
|
||||
'PluginStreamParent.h',
|
||||
'PluginUtilsOSX.h',
|
||||
'ScopedMethodFactory.h',
|
||||
'StreamNotifyChild.h',
|
||||
'StreamNotifyParent.h',
|
||||
]
|
||||
|
|
Загрузка…
Ссылка в новой задаче