| ... |
... |
@@ -222,6 +222,13 @@ void syncIOCancelPoll(CapIOManager *iomgr, StgTSO *tso) |
|
222
|
222
|
* status, as that is done by removeFromQueues (in the throwTo* functions).
|
|
223
|
223
|
*/
|
|
224
|
224
|
tso->block_info.closure = (StgClosure *)END_TSO_QUEUE;
|
|
|
225
|
+
|
|
|
226
|
+ /* We are in the TSO case, where the aiop was only reachable from the TSO
|
|
|
227
|
+ * itself, and thus it is now no longer be reachable at all.
|
|
|
228
|
+ */
|
|
|
229
|
+ IF_NONMOVING_WRITE_BARRIER_ENABLED {
|
|
|
230
|
+ updateRemembSetPushClosure(iomgr->cap, (StgClosure *)aiop);
|
|
|
231
|
+ }
|
|
225
|
232
|
}
|
|
226
|
233
|
|
|
227
|
234
|
|
| ... |
... |
@@ -279,7 +286,6 @@ static void notifyIOCompletion(CapIOManager *iomgr, StgAsyncIOOp *aiop) |
|
279
|
286
|
raiseAsync(iomgr->cap, tso,
|
|
280
|
287
|
(StgClosure *)blockedOnBadFD_closure,
|
|
281
|
288
|
false, NULL);
|
|
282
|
|
- break;
|
|
283
|
289
|
} else {
|
|
284
|
290
|
/* We should be guaranteed that the tso is still on the same
|
|
285
|
291
|
* cap because the tso was not on the run queue of any cap and
|
| ... |
... |
@@ -290,6 +296,12 @@ static void notifyIOCompletion(CapIOManager *iomgr, StgAsyncIOOp *aiop) |
|
290
|
296
|
tso->_link = END_TSO_QUEUE;
|
|
291
|
297
|
pushOnRunQueue(iomgr->cap, tso);
|
|
292
|
298
|
}
|
|
|
299
|
+ /* For the TSO case, the aiop was only reachable from the TSO
|
|
|
300
|
+ * itself, and thus it is now no longer be reachable at all.
|
|
|
301
|
+ */
|
|
|
302
|
+ IF_NONMOVING_WRITE_BARRIER_ENABLED {
|
|
|
303
|
+ updateRemembSetPushClosure(iomgr->cap, (StgClosure *)aiop);
|
|
|
304
|
+ }
|
|
293
|
305
|
break;
|
|
294
|
306
|
}
|
|
295
|
307
|
case NotifyMVar:
|