pdcomm_gem_spool_send_next
함수
수락된 전송 중에 스풀 큐의 맨 앞 메시지를 보냅니다.
PdcommStatus pdcomm_gem_spool_send_next(PdcommTcpEndpoint *endpoint, PdcommTcpToken *token)호스트의 S6F23 전송 요청이 수락된 뒤 호출합니다. 호출할 때마다 메시지 하나를 제출하며, 다음 맨 앞 메시지를 보내는 자동 반복은 없습니다. W1 메시지는 공유 대기 슬롯 32개 중 하나를 사용하고, W0 메시지는 별도의 단일 진행(single-flight) 토큰을 사용하며 응답 슬롯을 쓰지 않습니다. 제출은 전달이 아닙니다. 이어지는 #PDCOMM_GEM_SPOOL_DELIVERY_RESPONSE, #PDCOMM_GEM_SPOOL_DELIVERY_WRITTEN, #PDCOMM_GEM_SPOOL_DELIVERY_FAILED 결과를 처리하고, 성공 증거가 있으면 pdcomm_gem_spool_complete_delivery()를 호출합니다.
맨 앞 메시지를 제출할 수 없으면(W1 메시지에 쓸 빈 대기 슬롯이 없거나, 저장된 메시지가 유효하지 않거나, TCP 송신에 실패한 경우) 큐는 유지되고 현재 전송 실행이 끝납니다. 큐가 비어 있으면 실행이 끝나고 호출은 #PDCOMM_OUT_OF_RANGE를 반환합니다. 전송 중이 아니거나, 사용 중이거나, 동기화되지 않은 상태에서 호출하면 아무것도 제출하지 않습니다.
매개변수
| 이름 | 설명 |
|---|---|
endpoint | 스풀이 있고 Synchronized이면서 Communicating 상태인 장비 엔드포인트입니다. |
token | 제출한 메시지의 토큰을 받습니다. 실패하면 항상 0입니다. NULL이 아니어야 합니다. |
반환값
맨 앞 메시지를 제출했으면 #PDCOMM_OK를 반환합니다. 큐가 비어 있으면 #PDCOMM_OUT_OF_RANGE를 반환합니다. 활성 전송 실행이 없거나, 스풀이 동기화되지 않았거나, GEM이 Communicating 상태가 아니면 #PDCOMM_INVALID_STATE를 반환합니다. 준비된 TCP 이벤트(staged event)가 대기 중이거나, 전달 또는 디큐가 대기 중이거나, W1 메시지에 쓸 빈 대기 슬롯이 없거나, 송신 큐가 가득 차면 #PDCOMM_BACKPRESSURE를 반환합니다. 시도 번호가 소진되었거나 메시지가 한도를 넘으면 #PDCOMM_LIMIT_EXCEEDED를 반환합니다. 인수가 NULL이면 #PDCOMM_INVALID_ARGUMENT를 반환하며, 그 밖에 TCP 상태 코드 또는 #PDCOMM_POISONED를 반환합니다.