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

Commit 64a3f8f

Browse files
bsalomonSkia Commit-Bot
authored andcommitted
Revert "Use spin lock in SkIDChangeListener"
This reverts commit a624a53. Reason for revert: Bad perf Original change's description: > Use spin lock in SkIDChangeListener > > This lock should almost never be contested. This simplifies things and > also avoid mutex locks when one thread has multiple refs on a path, > image, ... > > Change-Id: I909b490363cb9e81b38ed9edd04272133fb2692b > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/274676 > Reviewed-by: Brian Osman <[email protected]> > Commit-Queue: Brian Salomon <[email protected]> [email protected],[email protected] Change-Id: I45ec3241906429e4d0783b68ebe6398079b73d36 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://skia-review.googlesource.com/c/skia/+/274956 Reviewed-by: Brian Salomon <[email protected]> Commit-Queue: Brian Salomon <[email protected]>
1 parent 20ed48e commit 64a3f8f

File tree

6 files changed

+59
-33
lines changed

6 files changed

+59
-33
lines changed

BUILD.gn

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1107,7 +1107,6 @@ static_library("pathkit") {
11071107
"src/core/SkRRect.cpp",
11081108
"src/core/SkRect.cpp",
11091109
"src/core/SkSemaphore.cpp",
1110-
"src/core/SkSpinlock.cpp",
11111110
"src/core/SkStream.cpp",
11121111
"src/core/SkString.cpp",
11131112
"src/core/SkStringUtils.cpp",

include/private/SkIDChangeListener.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#define SkIDChangeListener_DEFINED
1010

1111
#include "include/core/SkRefCnt.h"
12-
#include "include/private/SkSpinlock.h"
12+
#include "include/private/SkMutex.h"
1313
#include "include/private/SkTDArray.h"
1414

1515
#include <atomic>
@@ -49,7 +49,7 @@ class SkIDChangeListener : public SkRefCnt {
4949
* Add a new listener to the list. It must not already be deregistered. Also clears out
5050
* previously deregistered listeners.
5151
*/
52-
void add(sk_sp<SkIDChangeListener> listener);
52+
void add(sk_sp<SkIDChangeListener> listener, bool singleThreaded = false);
5353

5454
/**
5555
* The number of registered listeners (including deregisterd listeners that are yet-to-be
@@ -58,13 +58,13 @@ class SkIDChangeListener : public SkRefCnt {
5858
int count();
5959

6060
/** Calls changed() on all listeners that haven't been deregistered and resets the list. */
61-
void changed();
61+
void changed(bool singleThreaded = false);
6262

6363
/** Resets without calling changed() on the listeners. */
64-
void reset();
64+
void reset(bool singleThreaded = false);
6565

6666
private:
67-
SkSpinlock fSpinlock;
67+
SkMutex fMutex;
6868
SkTDArray<SkIDChangeListener*> fListeners; // pointers are reffed
6969
};
7070

src/core/SkIDChangeListener.cpp

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ using List = SkIDChangeListener::List;
2424
List::List() = default;
2525

2626
List::~List() {
27-
// We don't need the lock. No other thread should have this list while it's being
27+
// We don't need the mutex. No other thread should have this list while it's being
2828
// destroyed.
2929
for (int i = 0; i < fListeners.count(); ++i) {
3030
if (!fListeners[i]->shouldDeregister()) {
@@ -34,41 +34,61 @@ List::~List() {
3434
}
3535
}
3636

37-
void List::add(sk_sp<SkIDChangeListener> listener) {
37+
void List::add(sk_sp<SkIDChangeListener> listener, bool singleThreaded) {
3838
if (!listener) {
3939
return;
4040
}
4141
SkASSERT(!listener->shouldDeregister());
4242

43-
SkAutoSpinlock lock(fSpinlock);
44-
// Clean out any stale listeners before we append the new one.
45-
for (int i = 0; i < fListeners.count(); ++i) {
46-
if (fListeners[i]->shouldDeregister()) {
47-
fListeners[i]->unref();
48-
fListeners.removeShuffle(i--); // No need to preserve the order after i.
43+
auto add = [&] {
44+
// Clean out any stale listeners before we append the new one.
45+
for (int i = 0; i < fListeners.count(); ++i) {
46+
if (fListeners[i]->shouldDeregister()) {
47+
fListeners[i]->unref();
48+
fListeners.removeShuffle(i--); // No need to preserve the order after i.
49+
}
4950
}
51+
*fListeners.append() = listener.release();
52+
};
53+
54+
if (singleThreaded) {
55+
add();
56+
} else {
57+
SkAutoMutexExclusive lock(fMutex);
58+
add();
5059
}
51-
*fListeners.append() = listener.release();
5260
}
5361

5462
int List::count() {
55-
SkAutoSpinlock lock(fSpinlock);
63+
SkAutoMutexExclusive lock(fMutex);
5664
return fListeners.count();
5765
}
5866

59-
void List::changed() {
60-
SkAutoSpinlock lock(fSpinlock);
61-
for (SkIDChangeListener* listener : fListeners) {
62-
if (!listener->shouldDeregister()) {
63-
listener->changed();
67+
void List::changed(bool singleThreaded) {
68+
auto visit = [this]() {
69+
for (SkIDChangeListener* listener : fListeners) {
70+
if (!listener->shouldDeregister()) {
71+
listener->changed();
72+
}
73+
// Listeners get at most one shot, so whether these triggered or not, blow them away.
74+
listener->unref();
6475
}
65-
// Listeners get at most one shot, so whether these triggered or not, blow them away.
66-
listener->unref();
76+
fListeners.reset();
77+
};
78+
79+
if (singleThreaded) {
80+
visit();
81+
} else {
82+
SkAutoMutexExclusive lock(fMutex);
83+
visit();
6784
}
68-
fListeners.reset();
6985
}
7086

71-
void List::reset() {
72-
SkAutoSpinlock lock(fSpinlock);
73-
fListeners.unrefAll();
87+
void List::reset(bool singleThreaded) {
88+
if (singleThreaded) {
89+
fListeners.unrefAll();
90+
} else {
91+
SkAutoMutexExclusive lock(fMutex);
92+
fListeners.unrefAll();
93+
}
7494
}

src/core/SkPathRef.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,13 +479,17 @@ void SkPathRef::addGenIDChangeListener(sk_sp<SkIDChangeListener> listener) {
479479
if (this == gEmpty) {
480480
return;
481481
}
482-
fGenIDChangeListeners.add(std::move(listener));
482+
bool singleThreaded = this->unique();
483+
fGenIDChangeListeners.add(std::move(listener), singleThreaded);
483484
}
484485

485486
int SkPathRef::genIDChangeListenerCount() { return fGenIDChangeListeners.count(); }
486487

487488
// we need to be called *before* the genID gets changed or zerod
488-
void SkPathRef::callGenIDChangeListeners() { fGenIDChangeListeners.changed(); }
489+
void SkPathRef::callGenIDChangeListeners() {
490+
bool singleThreaded = this->unique();
491+
fGenIDChangeListeners.changed(singleThreaded);
492+
}
489493

490494
SkRRect SkPathRef::getRRect() const {
491495
const SkRect& bounds = this->getBounds();

src/core/SkPixelRef.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,23 @@ void SkPixelRef::addGenIDChangeListener(sk_sp<SkIDChangeListener> listener) {
7979
return;
8080
}
8181
SkASSERT(!listener->shouldDeregister());
82-
fGenIDChangeListeners.add(std::move(listener));
82+
bool singleThreaded = this->unique();
83+
fGenIDChangeListeners.add(std::move(listener), singleThreaded);
8384
}
8485

8586
// we need to be called *before* the genID gets changed or zerod
8687
void SkPixelRef::callGenIDChangeListeners() {
88+
bool singleThreaded = this->unique();
8789
// We don't invalidate ourselves if we think another SkPixelRef is sharing our genID.
8890
if (this->genIDIsUnique()) {
89-
fGenIDChangeListeners.changed();
91+
fGenIDChangeListeners.changed(singleThreaded);
9092
if (fAddedToCache.exchange(false)) {
9193
SkNotifyBitmapGenIDIsStale(this->getGenerationID());
9294
}
9395
} else {
9496
// Listeners get at most one shot, so even though these weren't triggered or not, blow them
9597
// away.
96-
fGenIDChangeListeners.reset();
98+
fGenIDChangeListeners.reset(singleThreaded);
9799
}
98100
}
99101

src/image/SkImage_Lazy.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,8 @@ GrColorType SkImage_Lazy::colorTypeOfLockTextureProxy(const GrCaps* caps) const
514514

515515
#if SK_SUPPORT_GPU
516516
void SkImage_Lazy::addUniqueIDListener(sk_sp<SkIDChangeListener> listener) const {
517-
fUniqueIDListeners.add(std::move(listener));
517+
bool singleThreaded = this->unique();
518+
fUniqueIDListeners.add(std::move(listener), singleThreaded);
518519
}
519520
#endif
520521

0 commit comments

Comments
 (0)