@@ -75,7 +75,8 @@ void tri_mutex::unlock_for_read()
7575 DEBUGDPP (" " , *this );
7676 assert (readers > 0 );
7777 if (--readers == 0 ) {
78- wake ();
78+ assert (!readers && !writers && !exclusively_used);
79+ wake (type_t ::none);
7980 }
8081}
8182
@@ -85,7 +86,9 @@ void tri_mutex::demote_to_read()
8586 DEBUGDPP (" " , *this );
8687 assert (exclusively_used);
8788 exclusively_used = false ;
89+ assert (!readers && !writers && !exclusively_used);
8890 ++readers;
91+ wake (type_t ::read);
8992}
9093
9194seastar::future<> tri_mutex::lock_for_write ()
@@ -118,7 +121,8 @@ void tri_mutex::unlock_for_write()
118121 DEBUGDPP (" " , *this );
119122 assert (writers > 0 );
120123 if (--writers == 0 ) {
121- wake ();
124+ assert (!readers && !writers && !exclusively_used);
125+ wake (type_t ::none);
122126 }
123127}
124128
@@ -128,7 +132,9 @@ void tri_mutex::demote_to_write()
128132 DEBUGDPP (" " , *this );
129133 assert (exclusively_used);
130134 exclusively_used = false ;
135+ assert (!readers && !writers && !exclusively_used);
131136 ++writers;
137+ wake (type_t ::write);
132138}
133139
134140// for exclusive users
@@ -163,7 +169,8 @@ void tri_mutex::unlock_for_excl()
163169 DEBUGDPP (" " , *this );
164170 assert (exclusively_used);
165171 exclusively_used = false ;
166- wake ();
172+ assert (!readers && !writers && !exclusively_used);
173+ wake (type_t ::none);
167174}
168175
169176bool tri_mutex::is_acquired () const
@@ -181,23 +188,22 @@ bool tri_mutex::is_acquired() const
181188 }
182189}
183190
184- void tri_mutex::wake ()
191+ void tri_mutex::wake (type_t type_to_wake )
185192{
186193 LOG_PREFIX (tri_mutex::wake ());
187194 DEBUGDPP (" " , *this );
188- assert (!readers && !writers && !exclusively_used);
189- type_t type = type_t ::none;
195+ assert (type_to_wake != type_t ::exclusive);
190196 while (!waiters.empty ()) {
191197 auto & waiter = waiters.front ();
192- if (type == type_t ::exclusive) {
198+ if (type_to_wake == type_t ::exclusive) {
193199 break ;
194- } if (type == type_t ::none) {
195- type = waiter.type ;
196- } else if (type != waiter.type ) {
200+ } if (type_to_wake == type_t ::none) {
201+ type_to_wake = waiter.type ;
202+ } else if (type_to_wake != waiter.type ) {
197203 // to be woken in the next batch
198204 break ;
199205 }
200- switch (type ) {
206+ switch (type_to_wake ) {
201207 case type_t ::read:
202208 ++readers;
203209 break ;
0 commit comments