@@ -24,7 +24,7 @@ using List = SkIDChangeListener::List;
2424List::List () = default;
2525
2626List::~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
5462int 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}
0 commit comments