| 2686 | } |
| 2687 | |
| 2688 | static bool runtime_client_exchange(cbm_daemon_runtime_client_t *client, |
| 2689 | cbm_daemon_runtime_operation_t operation, const void *request, |
| 2690 | uint32_t request_length, uint32_t timeout_ms, |
| 2691 | uint8_t **response_out, uint32_t expected_response_length) { |
| 2692 | *response_out = NULL; |
| 2693 | if (timeout_ms == CBM_DAEMON_IPC_WAIT_FOREVER) { |
| 2694 | return false; |
| 2695 | } |
| 2696 | cbm_mutex_lock(&client->exchange_mutex); |
| 2697 | cbm_mutex_lock(&client->state_mutex); |
| 2698 | if (!client->usable || client->closing || !client->connection) { |
| 2699 | cbm_mutex_unlock(&client->state_mutex); |
| 2700 | cbm_mutex_unlock(&client->exchange_mutex); |
| 2701 | return false; |
| 2702 | } |
| 2703 | cbm_daemon_ipc_connection_t *connection = client->connection; |
| 2704 | client->exchange_active = true; |
| 2705 | cbm_mutex_unlock(&client->state_mutex); |
| 2706 | |
| 2707 | cbm_mutex_lock(&client->send_mutex); |
| 2708 | bool sent = cbm_daemon_ipc_send_frame(connection, CBM_DAEMON_FRAME_REQUEST, (uint16_t)operation, |
| 2709 | request, request_length); |
| 2710 | cbm_mutex_unlock(&client->send_mutex); |
| 2711 | cbm_daemon_frame_t frame = {0}; |
| 2712 | uint8_t *payload = NULL; |
| 2713 | int received = |
| 2714 | sent ? cbm_daemon_ipc_receive_frame(connection, timeout_ms, &frame, &payload) : -1; |
| 2715 | bool valid = sent && received == 1 && frame.type == CBM_DAEMON_FRAME_RESPONSE && |
| 2716 | frame.flags == (uint16_t)operation && frame.length == expected_response_length; |
| 2717 | cbm_mutex_lock(&client->state_mutex); |
| 2718 | client->exchange_active = false; |
| 2719 | if (!valid) { |
| 2720 | client->usable = false; |
| 2721 | } |
| 2722 | cbm_mutex_unlock(&client->state_mutex); |
| 2723 | if (!valid) { |
| 2724 | free(payload); |
| 2725 | } else { |
| 2726 | *response_out = payload; |
| 2727 | } |
| 2728 | cbm_mutex_unlock(&client->exchange_mutex); |
| 2729 | return valid; |
| 2730 | } |
| 2731 | |
| 2732 | cbm_daemon_subscription_result_t cbm_daemon_runtime_client_job_subscribe( |
| 2733 | cbm_daemon_runtime_client_t *client, const char *project_key, |
no test coverage detected