mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 08:15:31 +00:00
e36783bdd1
In bug 1364624 we switched over to SRWLock on Windows for our internal implementation of mozilla::Mutex. This doesn't allow for re-entrancy. The WebCryptoThreadPool shutdown code has potential for re-entrancy due to the spinning of the main thread event loop while shutting down the worker threads. By limiting the scope of the lock protecting mPool during shutdown we can avoid the re-entrancy. Addtionally we track the shutdown status to avoid dispatching events once shutdown has started. --HG-- extra : rebase_source : 6e97a1fbdf4033ef93b3ecbafcf4b7898d9b19af
59 lines
1.3 KiB
C++
59 lines
1.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 mozilla_dom_WebCryptoThreadPool_h
|
|
#define mozilla_dom_WebCryptoThreadPool_h
|
|
|
|
#include "mozilla/Mutex.h"
|
|
#include "nsIObserver.h"
|
|
#include "nsIObserverService.h"
|
|
#include "nsIThreadPool.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
class WebCryptoThreadPool final : nsIObserver {
|
|
public:
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
|
|
static void
|
|
Initialize();
|
|
|
|
static nsresult
|
|
Dispatch(nsIRunnable* aRunnable);
|
|
|
|
private:
|
|
WebCryptoThreadPool()
|
|
: mMutex("WebCryptoThreadPool::mMutex")
|
|
, mPool(nullptr)
|
|
, mShutdown(false)
|
|
{ }
|
|
virtual ~WebCryptoThreadPool()
|
|
{ }
|
|
|
|
nsresult
|
|
Init();
|
|
|
|
nsresult
|
|
DispatchInternal(nsIRunnable* aRunnable);
|
|
|
|
void
|
|
Shutdown();
|
|
|
|
NS_IMETHOD Observe(nsISupports* aSubject,
|
|
const char* aTopic,
|
|
const char16_t* aData) override;
|
|
|
|
mozilla::Mutex mMutex;
|
|
nsCOMPtr<nsIThreadPool> mPool;
|
|
bool mShutdown;
|
|
};
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_dom_WebCryptoThreadPool_h
|