| 1439 | } |
| 1440 | |
| 1441 | bool cbm_subprocess_request_cancel(cbm_subprocess_t *process) { |
| 1442 | if (!process) { |
| 1443 | return false; |
| 1444 | } |
| 1445 | int lifecycle = atomic_load_explicit(&process->lifecycle, memory_order_acquire); |
| 1446 | for (;;) { |
| 1447 | if (lifecycle == CBM_SUBPROCESS_CANCEL_REQUESTED) { |
| 1448 | return true; |
| 1449 | } |
| 1450 | if (lifecycle != CBM_SUBPROCESS_ACTIVE) { |
| 1451 | return false; |
| 1452 | } |
| 1453 | int desired = CBM_SUBPROCESS_CANCEL_REQUESTED; |
| 1454 | if (atomic_compare_exchange_weak_explicit(&process->lifecycle, &lifecycle, desired, |
| 1455 | memory_order_acq_rel, memory_order_acquire)) { |
| 1456 | return true; |
| 1457 | } |
| 1458 | } |
| 1459 | } |
| 1460 | |
| 1461 | void cbm_subprocess_destroy(cbm_subprocess_t *process) { |
| 1462 | if (!process || atomic_load_explicit(&process->lifecycle, memory_order_acquire) != |
no outgoing calls