pdcomm_secs1_poll
함수
한 시간 구간 동안 회선 제어, 타이머, 콜백 I/O를 실행합니다.
PdcommStatus pdcomm_secs1_poll(PdcommSecs1Endpoint *endpoint, uint64_t now, size_t *attempts)호출할 때마다 최대 PdcommSecs1Options::poll_budget 단계를 수행합니다. 회선이 유휴 상태이면 다음 송신 블록을 시작하고, 만료된 타이머를 처리하고, 받은 문자와 완료된 쓰기를 처리하며, 쓰기와 읽기 콜백을 번갈아 시도합니다. 콜백은 이 함수에서만 호출됩니다. 결과는 이벤트로 큐에 쌓이며, pdcomm_secs1_next_event()로 비웁니다. 장애 상태인 엔드포인트는 아무 작업도 하지 않고 시도 횟수 0과 함께 #PDCOMM_OK를 반환합니다.
매개변수
| 이름 | 설명 |
|---|---|
endpoint | 시작된 엔드포인트입니다. |
now | 호출자 틱으로 나타낸 현재 시각이며, *_ticks 옵션과 같은 단위입니다. 이전 호출에 전달한 값보다 작으면 안 됩니다. |
attempts | 수행한 단계 수를 받습니다(먼저 0으로 설정). NULL이 아니어야 합니다. |
반환값
성공하면 #PDCOMM_OK를 반환합니다. attempts 또는 endpoint가 NULL이거나 내부 프로토콜 검사가 단계를 거부하면 #PDCOMM_INVALID_ARGUMENT를 반환합니다. 준비된 이벤트(staged event)를 먼저 가져와야 하거나 이벤트 큐가 가득 차면 #PDCOMM_BACKPRESSURE를 반환합니다(대기 중인 단계는 유지되므로 이벤트를 비운 뒤 다시 폴링합니다). 엔드포인트가 시작되지 않았거나, 다른 스레드에서의 호출, 동시 호출, 재진입 호출이면 #PDCOMM_INVALID_STATE를 반환합니다. now가 이전 값보다 작거나 타이머 기한이 오버플로하면 #PDCOMM_LIMIT_EXCEEDED를 반환합니다. 내부 버퍼를 할당할 수 없으면 #PDCOMM_ALLOCATION_FAILED를 반환합니다. 엔드포인트가 오염(poisoned) 상태이거나 오염 상태가 되면 #PDCOMM_POISONED를 반환합니다.
참고
- I/O 실패는 상태 코드가 아닙니다. #PDCOMM_SECS1_EVENT_FAULT 이벤트를 만들며 호출은 그래도 #PDCOMM_OK를 반환합니다.
- 스레드 안전성: 생성한 스레드에서만 호출하며, 콜백 안에서는 절대 호출하지 않습니다.