Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit f6ed5ed

Browse files
committed
Bug 1682928 - Make some data members atomic or const. r=asuth,dom-workers-and-storage-reviewers,sg, a=tjr
With this commit a few of EventSource's and EventSourceImpl's data members are now atomic, since a mutex isn't really necessary for their use case. Also, several data members are now marked const. Differential Revision: https://phabricator.services.mozilla.com/D101210
1 parent c20eddf commit f6ed5ed

File tree

2 files changed

+36
-57
lines changed

2 files changed

+36
-57
lines changed

dom/base/EventSource.cpp

Lines changed: 32 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -163,29 +163,8 @@ class EventSourceImpl final : public nsIObserver,
163163
mEventSource->mReadyState = aReadyState;
164164
}
165165

166-
bool IsFrozen() {
167-
MutexAutoLock lock(mMutex);
168-
return mFrozen;
169-
}
170-
171-
void SetFrozen(bool aFrozen) {
172-
MutexAutoLock lock(mMutex);
173-
mFrozen = aFrozen;
174-
}
175-
176166
bool IsClosed() { return ReadyState() == CLOSED; }
177167

178-
void ShutDown() {
179-
MutexAutoLock lock(mMutex);
180-
MOZ_ASSERT(!mIsShutDown);
181-
mIsShutDown = true;
182-
}
183-
184-
bool IsShutDown() {
185-
MutexAutoLock lock(mMutex);
186-
return mIsShutDown;
187-
}
188-
189168
RefPtr<EventSource> mEventSource;
190169

191170
/**
@@ -270,18 +249,18 @@ class EventSourceImpl final : public nsIObserver,
270249
// EventSourceImpl internal states.
271250
// WorkerRef to keep the worker alive. (accessed on worker thread only)
272251
RefPtr<ThreadSafeWorkerRef> mWorkerRef;
273-
// This mutex protects mServiceNotifier, mFrozen and mEventSource->mReadyState
274-
// that are used in different threads.
252+
// This mutex protects mServiceNotifier and mEventSource->mReadyState that are
253+
// used in different threads.
275254
mozilla::Mutex mMutex;
276255
// Whether the window is frozen. May be set on main thread and read on target
277-
// thread. Use mMutex to protect it before accessing it.
278-
bool mFrozen;
256+
// thread.
257+
Atomic<bool> mFrozen;
279258
// There are some messages are going to be dispatched when thaw.
280259
bool mGoingToDispatchAllMessages;
281260
// Whether the EventSource is run on main thread.
282-
bool mIsMainThread;
261+
const bool mIsMainThread;
283262
// Whether the EventSourceImpl is going to be destroyed.
284-
bool mIsShutDown;
263+
Atomic<bool> mIsShutDown;
285264

286265
class EventSourceServiceNotifier final {
287266
public:
@@ -390,9 +369,6 @@ EventSourceImpl::EventSourceImpl(EventSource* aEventSource,
390369
mCookieJarSettings(aCookieJarSettings),
391370
mTargetThread(NS_GetCurrentThread()) {
392371
MOZ_ASSERT(mEventSource);
393-
if (!mIsMainThread) {
394-
mEventSource->mIsMainThread = false;
395-
}
396372
SetReadyState(CONNECTING);
397373
}
398374

@@ -445,7 +421,8 @@ void EventSourceImpl::CloseInternal() {
445421
mServiceNotifier = nullptr;
446422
}
447423

448-
if (IsShutDown()) {
424+
MOZ_ASSERT(!mIsShutDown);
425+
if (mIsShutDown) {
449426
return;
450427
}
451428

@@ -466,7 +443,7 @@ void EventSourceImpl::CloseInternal() {
466443
while (mMessagesToDispatch.GetSize() != 0) {
467444
delete mMessagesToDispatch.PopFront();
468445
}
469-
SetFrozen(false);
446+
mFrozen = false;
470447
ResetDecoder();
471448
mUnicodeDecoder = nullptr;
472449
// Release the object on its owner. Don't access to any members
@@ -479,7 +456,8 @@ void EventSourceImpl::CleanupOnMainThread() {
479456
MOZ_ASSERT(IsClosed());
480457

481458
// Call ShutDown before cleaning any members.
482-
ShutDown();
459+
MOZ_ASSERT(!mIsShutDown);
460+
mIsShutDown = true;
483461

484462
if (mIsMainThread) {
485463
RemoveWindowObservers();
@@ -569,7 +547,7 @@ class ConnectRunnable final : public WorkerMainThreadRunnable {
569547

570548
nsresult EventSourceImpl::ParseURL(const nsAString& aURL) {
571549
AssertIsOnMainThread();
572-
MOZ_ASSERT(!IsShutDown());
550+
MOZ_ASSERT(!mIsShutDown);
573551
// get the src
574552
nsCOMPtr<nsIURI> baseURI;
575553
nsresult rv = GetBaseURI(getter_AddRefs(baseURI));
@@ -600,7 +578,7 @@ nsresult EventSourceImpl::ParseURL(const nsAString& aURL) {
600578
nsresult EventSourceImpl::AddWindowObservers() {
601579
AssertIsOnMainThread();
602580
MOZ_ASSERT(mIsMainThread);
603-
MOZ_ASSERT(!IsShutDown());
581+
MOZ_ASSERT(!mIsShutDown);
604582
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
605583
NS_ENSURE_STATE(os);
606584

@@ -773,7 +751,7 @@ nsresult EventSourceImpl::StreamReaderFunc(nsIInputStream* aInputStream,
773751
return NS_ERROR_FAILURE;
774752
}
775753
thisObject->AssertIsOnTargetThread();
776-
MOZ_ASSERT(!thisObject->IsShutDown());
754+
MOZ_ASSERT(!thisObject->mIsShutDown);
777755
thisObject->ParseSegment((const char*)aFromRawSegment, aCount);
778756
*aWriteCount = aCount;
779757
return NS_OK;
@@ -972,7 +950,7 @@ EventSourceImpl::IsOnCurrentThreadInfallible() { return IsTargetThread(); }
972950

973951
nsresult EventSourceImpl::GetBaseURI(nsIURI** aBaseURI) {
974952
AssertIsOnMainThread();
975-
MOZ_ASSERT(!IsShutDown());
953+
MOZ_ASSERT(!mIsShutDown);
976954
NS_ENSURE_ARG_POINTER(aBaseURI);
977955

978956
*aBaseURI = nullptr;
@@ -1001,7 +979,7 @@ nsresult EventSourceImpl::GetBaseURI(nsIURI** aBaseURI) {
1001979

1002980
void EventSourceImpl::SetupHttpChannel() {
1003981
AssertIsOnMainThread();
1004-
MOZ_ASSERT(!IsShutDown());
982+
MOZ_ASSERT(!mIsShutDown);
1005983
nsresult rv = mHttpChannel->SetRequestMethod("GET"_ns);
1006984
MOZ_ASSERT(NS_SUCCEEDED(rv));
1007985

@@ -1030,7 +1008,7 @@ void EventSourceImpl::SetupHttpChannel() {
10301008
nsresult EventSourceImpl::SetupReferrerInfo(
10311009
const nsCOMPtr<Document>& aDocument) {
10321010
AssertIsOnMainThread();
1033-
MOZ_ASSERT(!IsShutDown());
1011+
MOZ_ASSERT(!mIsShutDown);
10341012

10351013
if (aDocument) {
10361014
auto referrerInfo = MakeRefPtr<ReferrerInfo>(*aDocument);
@@ -1270,7 +1248,7 @@ nsresult EventSourceImpl::PrintErrorOnConsole(
12701248
const char* aBundleURI, const char* aError,
12711249
const nsTArray<nsString>& aFormatStrings) {
12721250
AssertIsOnMainThread();
1273-
MOZ_ASSERT(!IsShutDown());
1251+
MOZ_ASSERT(!mIsShutDown);
12741252
nsCOMPtr<nsIStringBundleService> bundleService =
12751253
mozilla::services::GetStringBundleService();
12761254
NS_ENSURE_STATE(bundleService);
@@ -1311,7 +1289,7 @@ nsresult EventSourceImpl::PrintErrorOnConsole(
13111289

13121290
nsresult EventSourceImpl::ConsoleError() {
13131291
AssertIsOnMainThread();
1314-
MOZ_ASSERT(!IsShutDown());
1292+
MOZ_ASSERT(!mIsShutDown);
13151293
nsAutoCString targetSpec;
13161294
nsresult rv = mSrc->GetSpec(targetSpec);
13171295
NS_ENSURE_SUCCESS(rv, rv);
@@ -1380,7 +1358,7 @@ NS_IMETHODIMP EventSourceImpl::Notify(nsITimer* aTimer) {
13801358

13811359
MOZ_ASSERT(!mHttpChannel, "the channel hasn't been cancelled!!");
13821360

1383-
if (!IsFrozen()) {
1361+
if (!mFrozen) {
13841362
nsresult rv = InitChannelAndRequestEventSource(mIsMainThread);
13851363
if (NS_FAILED(rv)) {
13861364
NS_WARNING("InitChannelAndRequestEventSource() failed");
@@ -1391,13 +1369,13 @@ NS_IMETHODIMP EventSourceImpl::Notify(nsITimer* aTimer) {
13911369

13921370
nsresult EventSourceImpl::Thaw() {
13931371
AssertIsOnMainThread();
1394-
if (IsClosed() || !IsFrozen()) {
1372+
if (IsClosed() || !mFrozen) {
13951373
return NS_OK;
13961374
}
13971375

13981376
MOZ_ASSERT(!mHttpChannel, "the connection hasn't been closed!!!");
13991377

1400-
SetFrozen(false);
1378+
mFrozen = false;
14011379
nsresult rv;
14021380
if (!mGoingToDispatchAllMessages && mMessagesToDispatch.GetSize() > 0) {
14031381
nsCOMPtr<nsIRunnable> event =
@@ -1419,18 +1397,18 @@ nsresult EventSourceImpl::Thaw() {
14191397

14201398
nsresult EventSourceImpl::Freeze() {
14211399
AssertIsOnMainThread();
1422-
if (IsClosed() || IsFrozen()) {
1400+
if (IsClosed() || mFrozen) {
14231401
return NS_OK;
14241402
}
14251403

14261404
MOZ_ASSERT(!mHttpChannel, "the connection hasn't been closed!!!");
1427-
SetFrozen(true);
1405+
mFrozen = true;
14281406
return NS_OK;
14291407
}
14301408

14311409
nsresult EventSourceImpl::DispatchCurrentMessageEvent() {
14321410
AssertIsOnTargetThread();
1433-
MOZ_ASSERT(!IsShutDown());
1411+
MOZ_ASSERT(!mIsShutDown);
14341412
UniquePtr<Message> message(std::move(mCurrentMessage));
14351413
ClearFields();
14361414

@@ -1467,7 +1445,7 @@ void EventSourceImpl::DispatchAllMessageEvents() {
14671445
AssertIsOnTargetThread();
14681446
mGoingToDispatchAllMessages = false;
14691447

1470-
if (IsClosed() || IsFrozen()) {
1448+
if (IsClosed() || mFrozen) {
14711449
return;
14721450
}
14731451

@@ -1532,7 +1510,7 @@ void EventSourceImpl::DispatchAllMessageEvents() {
15321510
return;
15331511
}
15341512

1535-
if (IsClosed() || IsFrozen()) {
1513+
if (IsClosed() || mFrozen) {
15361514
return;
15371515
}
15381516
}
@@ -1546,7 +1524,7 @@ void EventSourceImpl::ClearFields() {
15461524
}
15471525

15481526
nsresult EventSourceImpl::SetFieldAndClear() {
1549-
MOZ_ASSERT(!IsShutDown());
1527+
MOZ_ASSERT(!mIsShutDown);
15501528
AssertIsOnTargetThread();
15511529
if (mLastFieldName.IsEmpty()) {
15521530
mLastFieldValue.Truncate();
@@ -1624,7 +1602,7 @@ nsresult EventSourceImpl::CheckHealthOfRequestCallback(
16241602

16251603
// check if we have been closed or if the request has been canceled
16261604
// or if we have been frozen
1627-
if (IsClosed() || IsFrozen() || !mHttpChannel) {
1605+
if (IsClosed() || mFrozen || !mHttpChannel) {
16281606
return NS_ERROR_ABORT;
16291607
}
16301608

@@ -1836,7 +1814,7 @@ bool EventSourceImpl::CreateWorkerRef(WorkerPrivate* aWorkerPrivate) {
18361814
MOZ_ASSERT(aWorkerPrivate);
18371815
aWorkerPrivate->AssertIsOnWorkerThread();
18381816

1839-
if (IsShutDown()) {
1817+
if (mIsShutDown) {
18401818
return false;
18411819
}
18421820

@@ -1875,7 +1853,7 @@ EventSourceImpl::Dispatch(already_AddRefed<nsIRunnable> aEvent,
18751853
return NS_DispatchToMainThread(event_ref.forget());
18761854
}
18771855

1878-
if (IsShutDown()) {
1856+
if (mIsShutDown) {
18791857
// We want to avoid clutter about errors in our shutdown logs,
18801858
// so just report NS_OK (we have no explicit return value
18811859
// for shutdown).
@@ -1916,7 +1894,7 @@ EventSource::EventSource(nsIGlobalObject* aGlobal,
19161894
bool aWithCredentials)
19171895
: DOMEventTargetHelper(aGlobal),
19181896
mWithCredentials(aWithCredentials),
1919-
mIsMainThread(true) {
1897+
mIsMainThread(NS_IsMainThread()) {
19201898
MOZ_ASSERT(aGlobal);
19211899
MOZ_ASSERT(aCookieJarSettings);
19221900
mESImpl = new EventSourceImpl(this, aCookieJarSettings);

dom/base/EventSource.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef mozilla_dom_EventSource_h
1515
#define mozilla_dom_EventSource_h
1616

17+
#include "mozilla/Atomics.h"
1718
#include "mozilla/Attributes.h"
1819
#include "mozilla/DOMEventTargetHelper.h"
1920
#include "nsDeque.h"
@@ -92,9 +93,9 @@ class EventSource final : public DOMEventTargetHelper {
9293
// by EventSource.
9394
RefPtr<EventSourceImpl> mESImpl;
9495
nsString mOriginalURL;
95-
uint16_t mReadyState;
96-
bool mWithCredentials;
97-
bool mIsMainThread;
96+
Atomic<uint32_t> mReadyState;
97+
const bool mWithCredentials;
98+
const bool mIsMainThread;
9899
};
99100

100101
} // namespace dom

0 commit comments

Comments
 (0)