forked from mirrors/gecko-dev
This will be used to deprioritize whole thread pools. The concept works as such: - Set a thread pool's priority at any time - Each thread will ensure their priority mirrors the parent pool's priority when it is finished processing events. I chose to have threads only set themselves to the background when they finish processing events because an event dispatched at an expected priority should be completed at said priority. This ensures that any event dispatch that may expect normal priority (i.e. not operating in the background) has a chance to run at the established priority. This patch enrolls the background IO to low priority on its creation. It also includes the MacOS implementation of the thread priorities, which utilizes mac's QoS service. According to MacOS's QoS structure, main threads operate at `user-interactive` and offthread work is done at a `default` state, meaning that the OS decides how to set the thread's priority somewhere between `utility` and `user-interactive`. When a thread is put in the background, it must be manually raised back to the expected priority, which means most threads must set themselves to `default` again and the main thread must set itself to `user-interactive`. I demonstrated this in the `nsThread` implementation by checking for the main thread and if this task is running on the main thread somehow, then we use the correct setting. Rather than having the thread pools dispatch their own deprioritization tasks, I've decided to make this the job of the nsThread. In following bugs we will put entire processes' nsThreads in the background, which will require more use of the new nsThread codepaths. This behavior is currently restricted to nightly only. On platforms with no implementation, nothing will change. Differential Revision: https://phabricator.services.mozilla.com/D146534
68 lines
2.3 KiB
C++
68 lines
2.3 KiB
C++
/* -*- 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 nsThreadPool_h__
|
|
#define nsThreadPool_h__
|
|
|
|
#include "nsIThreadPool.h"
|
|
#include "nsIRunnable.h"
|
|
#include "nsCOMArray.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsThreadUtils.h"
|
|
#include "mozilla/Atomics.h"
|
|
#include "mozilla/AlreadyAddRefed.h"
|
|
#include "mozilla/CondVar.h"
|
|
#include "mozilla/EventQueue.h"
|
|
#include "mozilla/Mutex.h"
|
|
|
|
class nsIThread;
|
|
|
|
class nsThreadPool final : public mozilla::Runnable, public nsIThreadPool {
|
|
public:
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
NS_DECL_NSIEVENTTARGET_FULL
|
|
NS_DECL_NSITHREADPOOL
|
|
NS_DECL_NSIRUNNABLE
|
|
|
|
nsThreadPool();
|
|
|
|
static void InitTLS();
|
|
static nsThreadPool* GetCurrentThreadPool();
|
|
|
|
private:
|
|
~nsThreadPool();
|
|
|
|
void ShutdownThread(nsIThread* aThread);
|
|
nsresult PutEvent(nsIRunnable* aEvent);
|
|
nsresult PutEvent(already_AddRefed<nsIRunnable> aEvent, uint32_t aFlags);
|
|
|
|
mozilla::Mutex mMutex;
|
|
nsCOMArray<nsIThread> mThreads MOZ_GUARDED_BY(mMutex);
|
|
mozilla::CondVar mEventsAvailable MOZ_GUARDED_BY(mMutex);
|
|
mozilla::EventQueue mEvents MOZ_GUARDED_BY(mMutex);
|
|
uint32_t mThreadLimit MOZ_GUARDED_BY(mMutex);
|
|
uint32_t mIdleThreadLimit MOZ_GUARDED_BY(mMutex);
|
|
uint32_t mIdleThreadTimeout MOZ_GUARDED_BY(mMutex);
|
|
uint32_t mIdleCount MOZ_GUARDED_BY(mMutex);
|
|
nsIThread::QoSPriority mQoSPriority MOZ_GUARDED_BY(mMutex);
|
|
uint32_t mStackSize MOZ_GUARDED_BY(mMutex);
|
|
nsCOMPtr<nsIThreadPoolListener> mListener MOZ_GUARDED_BY(mMutex);
|
|
mozilla::Atomic<bool, mozilla::Relaxed> mShutdown;
|
|
bool mRegressiveMaxIdleTime MOZ_GUARDED_BY(mMutex);
|
|
mozilla::Atomic<bool, mozilla::Relaxed> mIsAPoolThreadFree;
|
|
// set once before we start threads
|
|
nsCString mName MOZ_GUARDED_BY(mMutex);
|
|
nsThreadPoolNaming mThreadNaming; // all data inside this is atomic
|
|
};
|
|
|
|
#define NS_THREADPOOL_CID \
|
|
{ /* 547ec2a8-315e-4ec4-888e-6e4264fe90eb */ \
|
|
0x547ec2a8, 0x315e, 0x4ec4, { \
|
|
0x88, 0x8e, 0x6e, 0x42, 0x64, 0xfe, 0x90, 0xeb \
|
|
} \
|
|
}
|
|
|
|
#endif // nsThreadPool_h__
|