| 1417 | } |
| 1418 | |
| 1419 | bool cbm_subprocess_request_cancel(cbm_subprocess_t *process) { |
| 1420 | if (!process) { |
| 1421 | return false; |
| 1422 | } |
| 1423 | int lifecycle = atomic_load_explicit(&process->lifecycle, memory_order_acquire); |
| 1424 | for (;;) { |
| 1425 | if (lifecycle == CBM_SUBPROCESS_CANCEL_REQUESTED) { |
| 1426 | return true; |
| 1427 | } |
| 1428 | if (lifecycle != CBM_SUBPROCESS_ACTIVE) { |
| 1429 | return false; |
| 1430 | } |
| 1431 | int desired = CBM_SUBPROCESS_CANCEL_REQUESTED; |
| 1432 | if (atomic_compare_exchange_weak_explicit(&process->lifecycle, &lifecycle, desired, |
| 1433 | memory_order_acq_rel, memory_order_acquire)) { |
| 1434 | return true; |
| 1435 | } |
| 1436 | } |
| 1437 | } |
| 1438 | |
| 1439 | void cbm_subprocess_destroy(cbm_subprocess_t *process) { |
| 1440 | if (!process || atomic_load_explicit(&process->lifecycle, memory_order_acquire) != |
no outgoing calls