diff options
Diffstat (limited to 'ipc/glue/MessagePump.h')
-rw-r--r-- | ipc/glue/MessagePump.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/ipc/glue/MessagePump.h b/ipc/glue/MessagePump.h new file mode 100644 index 000000000..3e48624ed --- /dev/null +++ b/ipc/glue/MessagePump.h @@ -0,0 +1,170 @@ +/* -*- 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 __IPC_GLUE_MESSAGEPUMP_H__ +#define __IPC_GLUE_MESSAGEPUMP_H__ + +#include "base/message_pump_default.h" +#if defined(XP_WIN) +#include "base/message_pump_win.h" +#endif + +#include "base/time.h" +#include "mozilla/Attributes.h" +#include "mozilla/Mutex.h" +#include "nsCOMPtr.h" +#include "nsIThreadInternal.h" + +class nsIThread; +class nsITimer; + +namespace mozilla { +namespace ipc { + +class DoWorkRunnable; + +class MessagePump : public base::MessagePumpDefault +{ + friend class DoWorkRunnable; + +public: + explicit MessagePump(nsIThread* aThread); + + // From base::MessagePump. + virtual void + Run(base::MessagePump::Delegate* aDelegate) override; + + // From base::MessagePump. + virtual void + ScheduleWork() override; + + // From base::MessagePump. + virtual void + ScheduleWorkForNestedLoop() override; + + // From base::MessagePump. + virtual void + ScheduleDelayedWork(const base::TimeTicks& aDelayedWorkTime) override; + + virtual nsIEventTarget* + GetXPCOMThread() override; + +protected: + virtual ~MessagePump(); + +private: + // Only called by DoWorkRunnable. + void DoDelayedWork(base::MessagePump::Delegate* aDelegate); + +protected: + nsIThread* mThread; + + // mDelayedWorkTimer and mThread are set in Run() by this class or its + // subclasses. + nsCOMPtr<nsITimer> mDelayedWorkTimer; + +private: + // Only accessed by this class. + RefPtr<DoWorkRunnable> mDoWorkEvent; +}; + +class MessagePumpForChildProcess final: public MessagePump +{ +public: + MessagePumpForChildProcess() + : MessagePump(nullptr), + mFirstRun(true) + { } + + virtual void Run(base::MessagePump::Delegate* aDelegate) override; + +private: + ~MessagePumpForChildProcess() + { } + + bool mFirstRun; +}; + +class MessagePumpForNonMainThreads final : public MessagePump +{ +public: + explicit MessagePumpForNonMainThreads(nsIThread* aThread) + : MessagePump(aThread) + { } + + virtual void Run(base::MessagePump::Delegate* aDelegate) override; + +private: + ~MessagePumpForNonMainThreads() + { } +}; + +#if defined(XP_WIN) +// Extends the TYPE_UI message pump to process xpcom events. Currently only +// implemented for Win. +class MessagePumpForNonMainUIThreads final: + public base::MessagePumpForUI, + public nsIThreadObserver +{ +public: + // We don't want xpcom refing, chromium controls our lifetime via + // RefCountedThreadSafe. + NS_IMETHOD_(MozExternalRefCountType) AddRef(void) override { + return 2; + } + NS_IMETHOD_(MozExternalRefCountType) Release(void) override { + return 1; + } + NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; + + NS_DECL_NSITHREADOBSERVER + +public: + explicit MessagePumpForNonMainUIThreads(nsIThread* aThread) : + mInWait(false), + mWaitLock("mInWait") + { + } + + // The main run loop for this thread. + virtual void DoRunLoop() override; + + virtual nsIEventTarget* + GetXPCOMThread() override + { + return nullptr; // not sure what to do with this one + } + +protected: + void SetInWait() { + MutexAutoLock lock(mWaitLock); + mInWait = true; + } + + void ClearInWait() { + MutexAutoLock lock(mWaitLock); + mInWait = false; + } + + bool GetInWait() { + MutexAutoLock lock(mWaitLock); + return mInWait; + } + +private: + ~MessagePumpForNonMainUIThreads() + { + } + + bool mInWait; + mozilla::Mutex mWaitLock; +}; +#endif // defined(XP_WIN) + +} /* namespace ipc */ +} /* namespace mozilla */ + +#endif /* __IPC_GLUE_MESSAGEPUMP_H__ */ |