| 2658 | } |
| 2659 | |
| 2660 | static bool runtime_client_exchange(cbm_daemon_runtime_client_t *client, |
| 2661 | cbm_daemon_runtime_operation_t operation, const void *request, |
| 2662 | uint32_t request_length, uint32_t timeout_ms, |
| 2663 | uint8_t **response_out, uint32_t expected_response_length) { |
| 2664 | *response_out = NULL; |
| 2665 | if (timeout_ms == CBM_DAEMON_IPC_WAIT_FOREVER) { |
| 2666 | return false; |
| 2667 | } |
| 2668 | cbm_mutex_lock(&client->exchange_mutex); |
| 2669 | cbm_mutex_lock(&client->state_mutex); |
| 2670 | if (!client->usable || client->closing || !client->connection) { |
| 2671 | cbm_mutex_unlock(&client->state_mutex); |
| 2672 | cbm_mutex_unlock(&client->exchange_mutex); |
| 2673 | return false; |
| 2674 | } |
| 2675 | cbm_daemon_ipc_connection_t *connection = client->connection; |
| 2676 | client->exchange_active = true; |
| 2677 | cbm_mutex_unlock(&client->state_mutex); |
| 2678 | |
| 2679 | cbm_mutex_lock(&client->send_mutex); |
| 2680 | bool sent = cbm_daemon_ipc_send_frame(connection, CBM_DAEMON_FRAME_REQUEST, (uint16_t)operation, |
| 2681 | request, request_length); |
| 2682 | cbm_mutex_unlock(&client->send_mutex); |
| 2683 | cbm_daemon_frame_t frame = {0}; |
| 2684 | uint8_t *payload = NULL; |
| 2685 | int received = |
| 2686 | sent ? cbm_daemon_ipc_receive_frame(connection, timeout_ms, &frame, &payload) : -1; |
| 2687 | bool valid = sent && received == 1 && frame.type == CBM_DAEMON_FRAME_RESPONSE && |
| 2688 | frame.flags == (uint16_t)operation && frame.length == expected_response_length; |
| 2689 | cbm_mutex_lock(&client->state_mutex); |
| 2690 | client->exchange_active = false; |
| 2691 | if (!valid) { |
| 2692 | client->usable = false; |
| 2693 | } |
| 2694 | cbm_mutex_unlock(&client->state_mutex); |
| 2695 | if (!valid) { |
| 2696 | free(payload); |
| 2697 | } else { |
| 2698 | *response_out = payload; |
| 2699 | } |
| 2700 | cbm_mutex_unlock(&client->exchange_mutex); |
| 2701 | return valid; |
| 2702 | } |
| 2703 | |
| 2704 | cbm_daemon_subscription_result_t cbm_daemon_runtime_client_job_subscribe( |
| 2705 | cbm_daemon_runtime_client_t *client, const char *project_key, |
no test coverage detected