Commit e4ecd60
committed
fix queue locking behavior when creating event lists
This fixes a race when creating queue events without acquiring
the appropriate locks, and also fixes a deadlock when acquiring
multiple queue locks.
The deadlock scenario is roughly this:
queue1 = ...;
queue2 = ...;
for (;;) {
queue1_event = urEnqueueKernelLaunch(queue1, ...);
// lock order: queue2->Mutex, queue1->Mutex
urEnqueueEventsWait(queue2, 1, [queue1_event], nullptr);
}
T2:
for (;;) {
queue2_event = urEnqueueKernelLaunch(queue2, ...);
// lock order: queue1->Mutex, queue2->Mutex
urEnqueueEventsWait(queue1, 1, [queue2_event], nullptr);
}
The solution in this patch is the simplest possible fix I managed
to figure out, but I strongly believe this code requires a substantial
refactor to better structure the synchronization logic. Right now
it's a minefield.1 parent 7fcfe3a commit e4ecd60
1 file changed
+25
-11
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1261 | 1261 | | |
1262 | 1262 | | |
1263 | 1263 | | |
1264 | | - | |
1265 | | - | |
1266 | | - | |
1267 | | - | |
1268 | | - | |
1269 | | - | |
1270 | | - | |
1271 | | - | |
1272 | | - | |
1273 | 1264 | | |
| 1265 | + | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + | |
| 1273 | + | |
| 1274 | + | |
| 1275 | + | |
| 1276 | + | |
| 1277 | + | |
| 1278 | + | |
| 1279 | + | |
| 1280 | + | |
| 1281 | + | |
| 1282 | + | |
| 1283 | + | |
1274 | 1284 | | |
1275 | 1285 | | |
1276 | 1286 | | |
| |||
1313 | 1323 | | |
1314 | 1324 | | |
1315 | 1325 | | |
1316 | | - | |
| 1326 | + | |
1317 | 1327 | | |
1318 | 1328 | | |
1319 | 1329 | | |
| |||
1323 | 1333 | | |
1324 | 1334 | | |
1325 | 1335 | | |
1326 | | - | |
| 1336 | + | |
1327 | 1337 | | |
1328 | 1338 | | |
1329 | 1339 | | |
| |||
1357 | 1367 | | |
1358 | 1368 | | |
1359 | 1369 | | |
| 1370 | + | |
| 1371 | + | |
| 1372 | + | |
| 1373 | + | |
1360 | 1374 | | |
1361 | 1375 | | |
1362 | 1376 | | |
| |||
0 commit comments