gecko-dev/dom/file/ipc/RemoteLazyInputStreamThread.h
Jens Stutte c26d88703b Bug 1926722 - Refactoring: Make RemoteLazyInputStreamThread's lifecycle more sound. r=dom-storage-reviewers,asuth,xpcom-reviewers,nika
In order to make things clearer, we:
- Use already_AddRefed for Get and GetOrCreate's return, ensuring the AddRef happens under the locked mutex and expecting that callers hold a strong reference until they need it.
- Make mThread const, such that there can never be a situation where we cannot use it as long as we have our RemoteLazyInputStreamThread instance.
- Add thread safety annotions for gRemoteLazyThreadMutex.

We can rely on mThread refusing to work after shutdown, in particular to dispatch runnables, such that we can just delegate most calls without additional checks.

We also remove the previous explicit observer implementation in favor of the simpler RunOnShutdown.

Differential Revision: https://phabricator.services.mozilla.com/D227036
2024-11-07 06:18:52 +00:00

52 lines
1.6 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_RemoteLazyInputStreamThread_h
#define mozilla_RemoteLazyInputStreamThread_h
#include "mozilla/RemoteLazyInputStreamChild.h"
#include "nsIEventTarget.h"
#include "nsIObserver.h"
#include "nsTArray.h"
class nsIThread;
namespace mozilla {
class RemoteLazyInputStreamChild;
// XXX Rename this class since it's used by LSNG too.
class RemoteLazyInputStreamThread final : public nsISerialEventTarget,
public nsIDirectTaskDispatcher {
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIEVENTTARGET_FULL
NS_DECL_NSISERIALEVENTTARGET
NS_DECL_NSIDIRECTTASKDISPATCHER
explicit RemoteLazyInputStreamThread(
MovingNotNull<nsCOMPtr<nsIThread>> aThread)
: mThread(std::move(aThread)) {}
static already_AddRefed<RemoteLazyInputStreamThread> Get();
static already_AddRefed<RemoteLazyInputStreamThread> GetOrCreate();
private:
~RemoteLazyInputStreamThread() = default;
// As long as we can access gRemoteLazyThread, mThread remains a valid
// object. We rely on it failing on late dispatch after its shutdown.
const NotNull<nsCOMPtr<nsIThread>> mThread;
};
bool IsOnDOMFileThread();
void AssertIsOnDOMFileThread();
} // namespace mozilla
#endif // mozilla_RemoteLazyInputStreamThread_h