void SfDelegate::initiateConnection( const char *uri, const KeyedVector<String8, String8> *headers, off64_t offset) { #ifdef ANDROID_DEFAULT_CODE GURL url(uri); #endif MessageLoop *loop = gNetworkThread->message_loop(); #ifdef ANDROID_DEFAULT_CODE loop->PostTask( FROM_HERE, NewRunnableFunction( &SfDelegate::OnInitiateConnectionWrapper, this, url, headers, offset)); #else loop->PostTask( FROM_HERE, NewRunnableFunction( &SfDelegate::OnInitiateConnectionWrapper, this, uri, headers, offset)); #endif }
bool UnixSocketConsumer::ConnectSocket(UnixSocketConnector* aConnector, const char* aAddress, int aDelayMs) { MOZ_ASSERT(aConnector); MOZ_ASSERT(NS_IsMainThread()); nsAutoPtr<UnixSocketConnector> connector(aConnector); if (mIO) { NS_WARNING("Socket already connecting/connected!"); return false; } nsCString addr(aAddress); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); mIO = new UnixSocketConsumerIO(ioLoop, this, connector.forget(), addr); SetConnectionStatus(SOCKET_CONNECTING); if (aDelayMs > 0) { DelayedConnectTask* connectTask = new DelayedConnectTask(mIO); mIO->SetDelayedConnectTask(connectTask); MessageLoop::current()->PostDelayedTask(FROM_HERE, connectTask, aDelayMs); } else { ioLoop->PostTask(FROM_HERE, new ConnectTask(mIO)); } return true; }
void SfDelegate::initiateDisconnect() { MessageLoop *loop = gNetworkThread->message_loop(); loop->PostTask( FROM_HERE, NewRunnableFunction( &SfDelegate::OnInitiateDisconnectWrapper, this)); }
void SfDelegate::initiateRead(void *data, size_t size) { MessageLoop *loop = gNetworkThread->message_loop(); loop->PostTask( FROM_HERE, NewRunnableFunction( &SfDelegate::OnInitiateReadWrapper, this, data, size)); }
void XRE_ShutdownChildProcess() { NS_ABORT_IF_FALSE(MessageLoopForUI::current(), "Wrong thread!"); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); NS_ABORT_IF_FALSE(!!ioLoop, "Bad shutdown order"); ioLoop->PostTask(FROM_HERE, new MessageLoop::QuitTask()); }
/*static*/ VRManagerParent* VRManagerParent::CreateSameProcess() { MessageLoop* loop = mozilla::layers::CompositorThreadHolder::Loop(); RefPtr<VRManagerParent> vmp = new VRManagerParent(base::GetCurrentProcId()); vmp->mCompositorThreadHolder = layers::CompositorThreadHolder::GetSingleton(); vmp->mSelfRef = vmp; loop->PostTask(NewRunnableFunction(RegisterVRManagerInCompositorThread, vmp.get())); return vmp.get(); }
/*static*/ VRManagerParent* VRManagerParent::CreateSameProcess() { MessageLoop* loop = VRListenerThreadHolder::Loop(); RefPtr<VRManagerParent> vmp = new VRManagerParent(base::GetCurrentProcId(), false); vmp->mVRListenerThreadHolder = VRListenerThreadHolder::GetSingleton(); vmp->mSelfRef = vmp; loop->PostTask(NewRunnableFunction("RegisterVRManagerInVRListenerThreadRunnable", RegisterVRManagerInVRListenerThread, vmp.get())); return vmp.get(); }
bool VRManagerParent::CreateForGPUProcess(Endpoint<PVRManagerParent>&& aEndpoint) { MessageLoop* loop = mozilla::layers::CompositorThreadHolder::Loop(); RefPtr<VRManagerParent> vmp = new VRManagerParent(aEndpoint.OtherPid()); vmp->mCompositorThreadHolder = layers::CompositorThreadHolder::GetSingleton(); loop->PostTask(NewRunnableMethod<Endpoint<PVRManagerParent>&&>( vmp, &VRManagerParent::Bind, Move(aEndpoint))); return true; }
/* static */ bool VRManagerParent::CreateForContent(Endpoint<PVRManagerParent>&& aEndpoint) { MessageLoop* loop = layers::CompositorThreadHolder::Loop(); RefPtr<VRManagerParent> vmp = new VRManagerParent(aEndpoint.OtherPid()); loop->PostTask(NewRunnableMethod<Endpoint<PVRManagerParent>&&>( vmp, &VRManagerParent::Bind, Move(aEndpoint))); return true; }
void GMPProcessParent::Delete() { MessageLoop* currentLoop = MessageLoop::current(); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); if (currentLoop == ioLoop) { Join(); delete this; return; } ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GMPProcessParent::Delete)); }
bool VRManagerParent::CreateForGPUProcess(Endpoint<PVRManagerParent>&& aEndpoint) { MessageLoop* loop = VRListenerThreadHolder::Loop(); RefPtr<VRManagerParent> vmp = new VRManagerParent(aEndpoint.OtherPid(), false); vmp->mVRListenerThreadHolder = VRListenerThreadHolder::GetSingleton(); loop->PostTask(NewRunnableMethod<Endpoint<PVRManagerParent>&&>( "gfx::VRManagerParent::Bind", vmp, &VRManagerParent::Bind, Move(aEndpoint))); return true; }
mozilla::ipc::IPCResult GPUParent::RecvNewWidgetCompositor(Endpoint<layers::PCompositorBridgeParent>&& aEndpoint, const CSSToLayoutDeviceScale& aScale, const TimeDuration& aVsyncRate, const bool& aUseExternalSurfaceSize, const IntSize& aSurfaceSize) { RefPtr<CompositorBridgeParent> cbp = new CompositorBridgeParent(aScale, aVsyncRate, aUseExternalSurfaceSize, aSurfaceSize); MessageLoop* loop = CompositorThreadHolder::Loop(); loop->PostTask(NewRunnableFunction(OpenParent, cbp, Move(aEndpoint))); return IPC_OK(); }
bool GeckoChildProcessHost::SyncLaunch(std::vector<std::string> aExtraOpts, int aTimeoutMs, base::ProcessArchitecture arch) { PrepareLaunch(); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); NS_ASSERTION(MessageLoop::current() != ioLoop, "sync launch from the IO thread NYI"); ioLoop->PostTask(NewNonOwningRunnableMethod <std::vector<std::string>, base::ProcessArchitecture> (this, &GeckoChildProcessHost::RunPerformAsyncLaunch, aExtraOpts, arch)); return WaitUntilConnected(aTimeoutMs); }
nsresult XRE_RunAppShell() { nsCOMPtr<nsIAppShell> appShell(do_GetService(kAppShellCID)); NS_ENSURE_TRUE(appShell, NS_ERROR_FAILURE); #if defined(XP_MACOSX) { // In content processes that want XPCOM (and hence want // AppShell), we usually run our hybrid event loop through // MessagePump::Run(), by way of nsBaseAppShell::Run(). The // Cocoa nsAppShell impl, however, implements its own Run() // that's unaware of MessagePump. That's all rather suboptimal, // but oddly enough not a problem... usually. // // The problem with this setup comes during startup. // XPCOM-in-subprocesses depends on IPC, e.g. to init the pref // service, so we have to init IPC first. But, IPC also // indirectly kinda-depends on XPCOM, because MessagePump // schedules work from off-main threads (e.g. IO thread) by // using NS_DispatchToMainThread(). If the IO thread receives a // Message from the parent before nsThreadManager is // initialized, then DispatchToMainThread() will fail, although // MessagePump will remember the task. This race condition // isn't a problem when appShell->Run() ends up in // MessagePump::Run(), because MessagePump will immediate see it // has work to do. It *is* a problem when we end up in [NSApp // run], because it's not aware that MessagePump has work that // needs to be processed; that was supposed to be signaled by // nsIRunnable(s). // // So instead of hacking Cocoa nsAppShell or rewriting the // event-loop system, we compromise here by processing any tasks // that might have been enqueued on MessagePump, *before* // MessagePump::ScheduleWork was able to successfully // DispatchToMainThread(). MessageLoop* loop = MessageLoop::current(); bool couldNest = loop->NestableTasksAllowed(); loop->SetNestableTasksAllowed(true); RefPtr<Runnable> task = new MessageLoop::QuitTask(); loop->PostTask(task.forget()); loop->Run(); loop->SetNestableTasksAllowed(couldNest); } #endif // XP_MACOSX return appShell->Run(); }
/*static*/ PImageBridgeParent* ImageBridgeParent::Create(Transport* aTransport, ProcessId aChildProcessId) { base::ProcessHandle processHandle; if (!base::OpenProcessHandle(aChildProcessId, &processHandle)) { return nullptr; } MessageLoop* loop = CompositorParent::CompositorLoop(); nsRefPtr<ImageBridgeParent> bridge = new ImageBridgeParent(loop, aTransport, aChildProcessId); bridge->mSelfRef = bridge; loop->PostTask(FROM_HERE, NewRunnableFunction(ConnectImageBridgeInParentProcess, bridge.get(), aTransport, processHandle)); return bridge.get(); }
void TexturePoolOGL::MaybeFillTextures() { if (sTextures->GetSize() < TEXTURE_REFILL_THRESHOLD && !sHasPendingFillTask) { LOG("need to refill the texture pool."); sHasPendingFillTask = true; MessageLoop* loop = mozilla::layers::CompositorThreadHolder::Loop(); MOZ_ASSERT(loop); loop->PostTask( NS_NewRunnableFunction( "TexturePoolOGL::MaybeFillTextures", [] () { TexturePoolOGL::Fill(sActiveContext); })); } }
/*static*/ bool ImageBridgeParent::Create(Transport* aTransport, ProcessId aOtherProcess) { ProcessHandle processHandle; if (!base::OpenProcessHandle(aOtherProcess, &processHandle)) { return false; } MessageLoop* loop = CompositorParent::CompositorLoop(); nsRefPtr<ImageBridgeParent> bridge = new ImageBridgeParent(loop, aTransport); bridge->mSelfRef = bridge; loop->PostTask(FROM_HERE, NewRunnableFunction(ConnectImageBridgeInParentProcess, bridge.get(), aTransport, processHandle)); return true; }
void SfDelegate::initiateConnection( const char *uri, const KeyedVector<String8, String8> *headers, off64_t offset) { GURL url(uri); MessageLoop *loop = gNetworkThread->message_loop(); loop->PostTask( FROM_HERE, NewRunnableFunction( &SfDelegate::OnInitiateConnectionWrapper, this, url, headers, offset)); }
GeckoChildProcessHost::GeckoChildProcessHost(GeckoProcessType aProcessType, base::WaitableEventWatcher::Delegate* aDelegate) : ChildProcessHost(RENDER_PROCESS), // FIXME/cjones: we should own this enum mProcessType(aProcessType), mMonitor("mozilla.ipc.GeckChildProcessHost.mMonitor"), mLaunched(false), mChannelInitialized(false), mDelegate(aDelegate), mChildProcessHandle(0) { MOZ_COUNT_CTOR(GeckoChildProcessHost); MessageLoop* ioLoop = BrowserProcessSubThread::GetMessageLoop(BrowserProcessSubThread::IO); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::InitializeChannel)); }
bool GeckoChildProcessHost::AsyncLaunch(std::vector<std::string> aExtraOpts) { MessageLoop* ioLoop = BrowserProcessSubThread::GetMessageLoop(BrowserProcessSubThread::IO); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::PerformAsyncLaunch, aExtraOpts)); // This may look like the sync launch wait, but we only delay as // long as it takes to create the channel. MonitorAutoEnter mon(mMonitor); while (!mChannelInitialized) { mon.Wait(); } return true; }
nsresult BluetoothDaemonConnection::ConnectSocket(BluetoothDaemonPDUConsumer* aConsumer) { MOZ_ASSERT(NS_IsMainThread()); if (mIO) { CHROMIUM_LOG("Bluetooth daemon already connecting/connected!"); return NS_ERROR_FAILURE; } SetConnectionStatus(SOCKET_CONNECTING); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); mIO = new BluetoothDaemonConnectionIO( ioLoop, -1, UnixSocketWatcher::SOCKET_IS_CONNECTING, this, aConsumer); ioLoop->PostTask(FROM_HERE, new BluetoothDaemonConnectTask(mIO)); return NS_OK; }
bool GeckoChildProcessHost::LaunchAndWaitForProcessHandle(StringVector aExtraOpts) { PrepareLaunch(); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::RunPerformAsyncLaunch, aExtraOpts, base::GetCurrentProcessArchitecture())); MonitorAutoLock lock(mMonitor); while (mProcessState < PROCESS_CREATED) { lock.Wait(); } MOZ_ASSERT(mProcessState == PROCESS_ERROR || mChildProcessHandle); return mProcessState < PROCESS_ERROR; }
bool GeckoChildProcessHost::SyncLaunch(std::vector<std::string> aExtraOpts, int aTimeoutMs, base::ProcessArchitecture arch) { PrepareLaunch(); PRIntervalTime timeoutTicks = (aTimeoutMs > 0) ? PR_MillisecondsToInterval(aTimeoutMs) : PR_INTERVAL_NO_TIMEOUT; MessageLoop* ioLoop = XRE_GetIOMessageLoop(); NS_ASSERTION(MessageLoop::current() != ioLoop, "sync launch from the IO thread NYI"); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::RunPerformAsyncLaunch, aExtraOpts, arch)); // NB: this uses a different mechanism than the chromium parent // class. MonitorAutoLock lock(mMonitor); PRIntervalTime waitStart = PR_IntervalNow(); PRIntervalTime current; // We'll receive several notifications, we need to exit when we // have either successfully launched or have timed out. while (mProcessState != PROCESS_CONNECTED) { // If there was an error then return it, don't wait out the timeout. if (mProcessState == PROCESS_ERROR) { break; } lock.Wait(timeoutTicks); if (timeoutTicks != PR_INTERVAL_NO_TIMEOUT) { current = PR_IntervalNow(); PRIntervalTime elapsed = current - waitStart; if (elapsed > timeoutTicks) { break; } timeoutTicks = timeoutTicks - elapsed; waitStart = current; } } return mProcessState == PROCESS_CONNECTED; }
bool GeckoChildProcessHost::AsyncLaunch(std::vector<std::string> aExtraOpts) { PrepareLaunch(); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::RunPerformAsyncLaunch, aExtraOpts, base::GetCurrentProcessArchitecture())); // This may look like the sync launch wait, but we only delay as // long as it takes to create the channel. MonitorAutoLock lock(mMonitor); while (mProcessState < CHANNEL_INITIALIZED) { lock.Wait(); } return true; }
GeckoChildProcessHost::GeckoChildProcessHost(GeckoProcessType aProcessType, base::WaitableEventWatcher::Delegate* aDelegate) : ChildProcessHost(RENDER_PROCESS), // FIXME/cjones: we should own this enum mProcessType(aProcessType), mMonitor("mozilla.ipc.GeckChildProcessHost.mMonitor"), mLaunched(false), mChannelInitialized(false), mDelegate(aDelegate), mChildProcessHandle(0) #if defined(MOZ_WIDGET_COCOA) , mChildTask(MACH_PORT_NULL) #endif { MOZ_COUNT_CTOR(GeckoChildProcessHost); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::InitializeChannel)); }
GeckoChildProcessHost::GeckoChildProcessHost(GeckoProcessType aProcessType, ChildPrivileges aPrivileges) : ChildProcessHost(RENDER_PROCESS), // FIXME/cjones: we should own this enum mProcessType(aProcessType), mPrivileges(aPrivileges), mMonitor("mozilla.ipc.GeckChildProcessHost.mMonitor"), mProcessState(CREATING_CHANNEL), mDelegate(nullptr), mChildProcessHandle(0) #if defined(MOZ_WIDGET_COCOA) , mChildTask(MACH_PORT_NULL) #endif { MOZ_COUNT_CTOR(GeckoChildProcessHost); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::InitializeChannel)); }
bool GeckoChildProcessHost::SyncLaunch(std::vector<std::string> aExtraOpts) { MessageLoop* ioLoop = BrowserProcessSubThread::GetMessageLoop(BrowserProcessSubThread::IO); NS_ASSERTION(MessageLoop::current() != ioLoop, "sync launch from the IO thread NYI"); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::PerformAsyncLaunch, aExtraOpts)); // NB: this uses a different mechanism than the chromium parent // class. MonitorAutoEnter mon(mMonitor); while (!mLaunched) { mon.Wait(); } return true; }
bool GeckoChildProcessHost::AsyncLaunch(std::vector<std::string> aExtraOpts) { #ifdef XP_WIN InitWindowsGroupID(); #endif MessageLoop* ioLoop = XRE_GetIOMessageLoop(); ioLoop->PostTask(FROM_HERE, NewRunnableMethod(this, &GeckoChildProcessHost::PerformAsyncLaunch, aExtraOpts, base::GetCurrentProcessArchitecture())); // This may look like the sync launch wait, but we only delay as // long as it takes to create the channel. MonitorAutoLock lock(mMonitor); while (!mChannelInitialized) { lock.Wait(); } return true; }