| 5826 | break; |
| 5827 | } |
| 5828 | pthread_mutex_lock(&upstream.write_mu); |
| 5829 | dist_send_error(fd, "unsupported distributed worker frame"); |
| 5830 | pthread_mutex_unlock(&upstream.write_mu); |
| 5831 | fprintf(stderr, "ds4: distributed worker: rejected unsupported frame type %u\n", type); |
| 5832 | loop_rc = 1; |
| 5833 | break; |
| 5834 | } |
| 5835 | |
| 5836 | dist_worker_upstream_destroy(&upstream); |
| 5837 | return loop_rc; |
| 5838 | } |
| 5839 | |
| 5840 | static int dist_send_work_result( |
| 5841 | int fd, |
| 5842 | uint64_t request_id, |
| 5843 | uint64_t result_hash, |
| 5844 | uint32_t status, |
| 5845 | uint32_t result_kind, |
| 5846 | uint32_t payload_bits, |
| 5847 | const ds4_dist_telemetry_fixed *telemetry, |
| 5848 | uint32_t telemetry_count, |
| 5849 | const void *payload, |
| 5850 | uint32_t payload_bytes) { |
| 5851 | if (payload_bytes != 0 && !payload) return -1; |
| 5852 | if (telemetry_count != 0 && !telemetry) return -1; |
| 5853 | uint32_t wire_payload_bytes = payload_bytes; |
| 5854 | uint64_t hidden_values = 0; |
| 5855 | if (status == 0 && result_kind == DS4_DIST_RESULT_HIDDEN_STATE) { |
| 5856 | payload_bits = dist_activation_bits_or_default(payload_bits); |
| 5857 | if (!dist_activation_bits_valid(payload_bits) || |
| 5858 | (payload_bytes % (uint32_t)sizeof(float)) != 0) |
| 5859 | return -1; |
| 5860 | hidden_values = payload_bytes / (uint32_t)sizeof(float); |
| 5861 | if (!dist_activation_wire_bytes(payload_bits, hidden_values, &wire_payload_bytes)) |
| 5862 | return -1; |
| 5863 | } else if (status == 0 && result_kind == DS4_DIST_RESULT_LOGITS) { |
| 5864 | payload_bits = 32u; |
| 5865 | } else { |
| 5866 | payload_bits = 0; |
| 5867 | } |
| 5868 | const uint64_t telemetry_bytes64 = |
| 5869 | (uint64_t)telemetry_count * sizeof(ds4_dist_telemetry_fixed); |
| 5870 | if (telemetry_bytes64 > UINT32_MAX) return -1; |
| 5871 | const uint32_t telemetry_bytes = (uint32_t)telemetry_bytes64; |
| 5872 | const uint64_t frame_bytes = sizeof(ds4_dist_result_fixed) + |
| 5873 | telemetry_bytes64 + |
| 5874 | (uint64_t)wire_payload_bytes; |
| 5875 | if (frame_bytes > UINT32_MAX) return -1; |
| 5876 | |
| 5877 | ds4_dist_result_fixed r; |
| 5878 | dist_u64_to_halves(request_id, &r.request_hi, &r.request_lo); |
| 5879 | dist_u64_to_halves(status == 0 ? result_hash : 0, |
| 5880 | &r.result_hash_hi, |
| 5881 | &r.result_hash_lo); |
| 5882 | r.status = status; |
| 5883 | r.result_kind = result_kind; |
| 5884 | r.telemetry_count = telemetry_count; |
| 5885 | r.telemetry_bytes = telemetry_bytes; |
no test coverage detected