콘텐츠로 이동
무료 평가 시작

pdcomm_gem_program_respond

함수

수신한 S7F1, F3, F5, F17 또는 F19 요청에 응답합니다.

PdcommStatus pdcomm_gem_program_respond(PdcommTcpEndpoint *endpoint, PdcommGemResult *result, uint32_t mode, uint8_t decision)

선언 위치: #include <pdcomm_gem_programs.h>

result는 이 엔드포인트의 현재 세대(generation)와 HSMS 선택에서 나온, 아직 응답하지 않은 #PDCOMM_GEM_PROGRAM_RECEIVED 1차 메시지여야 하며, 수신 응답 슬롯이 아직 유효해야 합니다. GEM은 Communicating 상태여야 합니다. 원래 TCP 이벤트는 이미 해제되었어도 됩니다.

  • **S7F1:** 라이브러리의 고정 검사(기존 프로그램, 용량, 잘못된 PPID, 사용 중이거나 예약된 허가, 저장소 기준 mode 검사)가 먼저 실행되며, 그 검사의 PPGNT가 우선합니다. 그렇지 않으면 decision 0은 허가하고, 1부터 5는 PPGNT 1(이미 있음), 2(공간 없음), 3(잘못된 PPID), 4(사용 중), 5(수락하지 않음)로 거부합니다. 허가한 요청은 S7F2가 송신 큐에 들어간 뒤에야 mode에 대한 허가를 활성화합니다.
  • **S7F3:** 저장소 한도에 맞지 않는 프로그램에는 ACKC7 3(매트릭스 오버플로)으로 응답합니다. 그렇지 않으면 decision 1부터 5는 ACKC7 1(허가되지 않음), 2(길이 오류), 3(매트릭스 오버플로), 4(PPID 없음), 5(지원하지 않는 모드)로 거부합니다. 수락한 프로그램도 라이브러리가 거부할 수 있습니다. 허가 정책이 요구하는 허가가 없으면 ACKC7 1, 다른 허가가 활성 상태이거나 허가된 모드가 mode와 다르면 5, 본문 길이가 허가된 LENGTH와 다르면 2, REPLACE가 없는 프로그램을 지정하면 4, CREATE가 기존 프로그램을 지정하면 5입니다. 수락한 프로그램은 S7F4가 큐에 들어가기 전에 반영되고 커밋되며, 해당 허가는 소진됩니다.
  • **S7F5:** 저장된 프로그램 또는 알 수 없음 센티널(빈 PPID, 빈 Binary 본문)을 담은 S7F6으로 응답합니다. decision은 0이어야 합니다.
  • **S7F17:** decision 1부터 5는 S7F3과 같은 방식으로 거부합니다. max_request_ids보다 많은 PPID를 지정한 요청에는 ACKC7 3(매트릭스 오버플로)으로 응답합니다. 저장되지 않은 PPID가 있으면(저장소가 받아들이는 것보다 긴 PPID 포함) ACKC7 4(PPID 없음)로 응답합니다. 허가가 하나라도 활성 상태이면 응답은 ACKC7 5입니다. 거부한 요청은 아무것도 삭제하지 않습니다. 그 밖에는 S7F18이 큐에 들어가기 전에 나열된 프로그램(빈 목록이면 전체)을 삭제하고 반영합니다. 같은 PPID가 반복되면 한 번만 삭제합니다.
  • **S7F19:** 저장된 모든 PPID를 나열한 S7F20으로 응답합니다. decision은 0이어야 합니다.

준비된 응답은 전송 전에 결과에 보관됩니다. 따라서 #PDCOMM_BACKPRESSURE나 전송 실패 뒤에도 applied가 이미 1일 수 있습니다. 같은 mode와 decision으로 다시 시도합니다. 이 호출은 보관된 응답만 보내며 다시 기록하지 않습니다. #PDCOMM_PROGRAM_UNCONFIRMED 이후에는 반영된 변경이 유지되지만, pdcomm_gem_program_confirm_reply()로 불확실성을 수락할 때까지 확인 응답을 보내지 않습니다.

매개변수

이름설명
endpoint프로그램 저장소가 있고 Communicating 상태인 GEM 엔드포인트입니다.
resultpdcomm_gem_handle_event()에서 얻은 프로그램 요청 결과입니다. reply_sent, acknowledgement와 처리 관련 필드가 갱신됩니다.
mode#PDCOMM_GEM_PROGRAM_CREATE, #PDCOMM_GEM_PROGRAM_REPLACE, #PDCOMM_GEM_PROGRAM_UPSERT 중 하나입니다. S7F1과 S7F3에서 사용하지만 모든 요청에서 검증합니다.
decision0이면 수락합니다. 1부터 5는 위에 설명한 대로 S7F1, S7F3, S7F17을 거부합니다. S7F5와 S7F19에서는 0이어야 합니다.

반환값

응답이 큐에 들어가면 #PDCOMM_OK를 반환합니다. 디렉터리 동기화가 확인되지 않은 채 변경이 반영되어 응답을 보내지 않았으면 #PDCOMM_PROGRAM_UNCONFIRMED를 반환합니다. 결과가 다른 엔드포인트, 세대, 선택에 속하거나, 이미 응답했거나, 수신 슬롯이 사라졌으면 #PDCOMM_STALE_TOKEN을 반환합니다. result가 NULL이거나, mode 또는 decision이 잘못되었거나, 다른 mode 또는 decision으로 재시도하면 #PDCOMM_INVALID_ARGUMENT를 반환합니다. 결과가 프로그램 요청이 아니거나, 프로그램 저장소가 구성되지 않았거나, GEM이 Communicating 상태가 아니면 #PDCOMM_INVALID_STATE를 반환합니다. 준비된 TCP 이벤트(staged event)가 대기 중이거나 송신 큐가 가득 차면 #PDCOMM_BACKPRESSURE를 반환합니다. 형식이 잘못된 요청이면 #PDCOMM_INVALID_DATA를 반환합니다. #PDCOMM_IO_ERROR 같은 영구 저장 오류를 반환할 수 있으며, 이때 아무것도 반영되지 않고 재시도할 수 있습니다. 그 밖에 #PDCOMM_ALLOCATION_FAILED 또는 #PDCOMM_POISONED를 반환할 수 있습니다.