| 2703 | } |
| 2704 | |
| 2705 | static void application_request_cancel(void *context, |
| 2706 | cbm_daemon_runtime_application_session_t *opaque_session, |
| 2707 | cbm_daemon_runtime_application_token_t request_token) { |
| 2708 | cbm_daemon_application_t *application = context; |
| 2709 | cbm_daemon_application_session_t *session = (cbm_daemon_application_session_t *)opaque_session; |
| 2710 | if (!application || !session || session->application != application || |
| 2711 | request_token == CBM_DAEMON_RUNTIME_APPLICATION_TOKEN_INVALID) { |
| 2712 | return; |
| 2713 | } |
| 2714 | cbm_mutex_lock(&application->mutex); |
| 2715 | if (!session->session_cancelled && |
| 2716 | (!session->request_active || session->active_request_token == request_token)) { |
| 2717 | session->request_cancel_token = request_token; |
| 2718 | bool active_match = session->request_active; |
| 2719 | if (active_match && session->active_job && session->active_job_subscribed) { |
| 2720 | cbm_daemon_application_job_t *job = session->active_job; |
| 2721 | session->active_job = NULL; |
| 2722 | session->active_job_subscribed = false; |
| 2723 | application_job_unsubscribe_locked(job); |
| 2724 | } |
| 2725 | if (active_match) { |
| 2726 | /* Keep the MCP atomic cancel inside the same completion mutex. |
| 2727 | * Otherwise this callback could pause after unlocking and set the |
| 2728 | * flag on a later request that already reused this session. */ |
| 2729 | (void)cbm_mcp_server_cancel_active(session->mcp); |
| 2730 | } |
| 2731 | } |
| 2732 | cbm_mutex_unlock(&application->mutex); |
| 2733 | } |
| 2734 | |
| 2735 | static void application_session_cancel(void *context, |
| 2736 | cbm_daemon_runtime_application_session_t *opaque_session) { |
nothing calls this directly
no test coverage detected