| 860 | } |
| 861 | |
| 862 | static cbm_daemon_runtime_application_status_t runtime_application_request( |
| 863 | void *opaque, cbm_daemon_runtime_application_session_t *opaque_session, |
| 864 | cbm_daemon_runtime_application_token_t request_token, const uint8_t *request, |
| 865 | uint32_t request_length, uint8_t **response_out, uint32_t *response_length_out) { |
| 866 | (void)request_token; |
| 867 | runtime_application_context_t *context = opaque; |
| 868 | runtime_application_session_t *session = (runtime_application_session_t *)opaque_session; |
| 869 | if (!context || !session || session->context != context || !response_out || |
| 870 | !response_length_out || (request_length > 0 && !request)) { |
| 871 | return CBM_DAEMON_RUNTIME_APPLICATION_HANDLER_ERROR; |
| 872 | } |
| 873 | *response_out = NULL; |
| 874 | *response_length_out = 0; |
| 875 | int request_index = atomic_fetch_add_explicit(&context->requests, 1, memory_order_relaxed); |
| 876 | if (request_index == 0 && |
| 877 | atomic_load_explicit(&context->block_first_request, memory_order_acquire)) { |
| 878 | atomic_store_explicit(&context->first_request_started, true, memory_order_release); |
| 879 | bool ignore_cancel = |
| 880 | atomic_load_explicit(&context->ignore_first_request_cancel, memory_order_acquire); |
| 881 | while (!(ignore_cancel |
| 882 | ? atomic_load_explicit(&context->release_first_request, memory_order_acquire) |
| 883 | : atomic_load_explicit(&session->cancel_requested, memory_order_acquire))) { |
| 884 | struct timespec pause = {.tv_sec = 0, .tv_nsec = 1000000}; |
| 885 | (void)cbm_nanosleep(&pause, NULL); |
| 886 | } |
| 887 | return CBM_DAEMON_RUNTIME_APPLICATION_CANCELLED; |
| 888 | } |
| 889 | if (request_length == 0) { |
| 890 | return CBM_DAEMON_RUNTIME_APPLICATION_OK; |
| 891 | } |
| 892 | uint8_t *response = malloc(request_length); |
| 893 | if (!response) { |
| 894 | return CBM_DAEMON_RUNTIME_APPLICATION_HANDLER_ERROR; |
| 895 | } |
| 896 | memcpy(response, request, request_length); |
| 897 | *response_out = response; |
| 898 | *response_length_out = request_length; |
| 899 | return CBM_DAEMON_RUNTIME_APPLICATION_OK; |
| 900 | } |
| 901 | |
| 902 | static void *runtime_application_client_request_thread(void *opaque) { |
| 903 | runtime_application_client_call_t *call = opaque; |
nothing calls this directly
no test coverage detected