diff --git a/src/etcp.c b/src/etcp.c index 0369adc..f7e3047 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -388,16 +388,16 @@ int etcp_int_send(struct ETCP_CONN* etcp, const void* data, uint16_t len) { static void input_queue_try_resume(struct ETCP_CONN* etcp) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); - // если размер input_wait_ack+input_send_q в байтах < optimal_inflight то resume сейчас. - size_t wait_ack_bytes = queue_total_bytes(etcp->input_wait_ack); + // Сперва отправим всё из очереди отправки size_t send_q_bytes = queue_total_bytes(etcp->input_send_q); - size_t total_bytes = wait_ack_bytes + send_q_bytes; + queue_resume_callback(etcp->input_send_q);// вызвать лишний раз resume не страшно. + if (send_q_bytes>0) return; - if (total_bytes <= etcp->optimal_inflight || send_q_bytes>0) { - DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] resume callbacks: inflight_bytes=%d, input_len=%d", etcp->log_name, total_bytes, etcp->input_queue->total_bytes); - queue_resume_callback(etcp->input_send_q);// вызвать лишний раз resume не страшно. -//etcp_stats(etcp); - if (queue_entry_count(etcp->input_send_q) == 0) queue_resume_callback(etcp->input_queue);// и только когда больше нечего отправлять - забираем новый пакет + // когда очередь отправки пуста - пробуем взять новый пакет на обработку + size_t wait_ack_bytes = queue_total_bytes(etcp->input_wait_ack); + if (wait_ack_bytes <= etcp->optimal_inflight) { + DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] resume input queue: inflight_bytes=%d, input_len=%d", etcp->log_name, wait_ack_bytes, etcp->input_queue->total_bytes); + queue_resume_callback(etcp->input_queue);// и только когда больше нечего отправлять - забираем новый пакет } } @@ -494,7 +494,6 @@ static void input_queue_cb(struct ll_queue* q, void* arg) { // DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "input_queue_cb: successfully moved from input_queue to input_send_q"); etcp_conn_process_send_queue(etcp);// сразу обработаем этот пакет -// input_queue_try_resume(etcp); DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] nextloop, input_queue size=%d ", etcp->log_name, q->count); } @@ -594,7 +593,7 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) { if (send_q_size == 0) {// сгребаем из input_queue // DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "etcp_request_pkt: input_send_q empty, check if avail input_queue -> inflight"); input_queue_try_resume(etcp); -// return NULL; + return NULL; } // First, check if there's a packet in input_send_q (retrans or new)