| 1403 | } |
| 1404 | |
| 1405 | bool cbm_subprocess_request_cancel(cbm_subprocess_t *process) { |
| 1406 | if (!process) { |
| 1407 | return false; |
| 1408 | } |
| 1409 | int lifecycle = atomic_load_explicit(&process->lifecycle, memory_order_acquire); |
| 1410 | for (;;) { |
| 1411 | if (lifecycle == CBM_SUBPROCESS_CANCEL_REQUESTED) { |
| 1412 | return true; |
| 1413 | } |
| 1414 | if (lifecycle != CBM_SUBPROCESS_ACTIVE) { |
| 1415 | return false; |
| 1416 | } |
| 1417 | int desired = CBM_SUBPROCESS_CANCEL_REQUESTED; |
| 1418 | if (atomic_compare_exchange_weak_explicit(&process->lifecycle, &lifecycle, desired, |
| 1419 | memory_order_acq_rel, memory_order_acquire)) { |
| 1420 | return true; |
| 1421 | } |
| 1422 | } |
| 1423 | } |
| 1424 | |
| 1425 | void cbm_subprocess_destroy(cbm_subprocess_t *process) { |
| 1426 | if (!process || atomic_load_explicit(&process->lifecycle, memory_order_acquire) != |
no outgoing calls