2012-03-07 2 views
2

중요하지 않은 네이티브 확장에는 동적으로 할당되는 인터프리터 데이터 구조가 필요합니다.Tcl 확장 : 확장의 수명주기 'ClientData

현재 확장명에 에 해당하는 키와 적절한 삭제 루틴 인 이있는 Tcl_SetAssocData를 사용하여이 메모리가 누출되지 않도록합니다.

그러나 Tcl_PkgProvideEx도 이와 같은 정보를 기록 할 수 있습니다. 이 정보는 Tcl_PkgRequireEx로 검색 할 수 있습니다. 확장 기능의 데이터 구조를 패키지와 연결하는 것이 "잡아 가방"보다 더 자연 스럽습니다. AssocData; 그러나 Pkg * Ex 루틴은 자동으로 호출 된 삭제 루틴을 제공하지 않습니다. 그래서 AssocData 방식을 유지하려면 이 필요하다고 생각합니다.

Pkg * Ex 루틴은 어떤 상황에서 설계 되었습니까?

또한 Tcl 라이브러리에서는 ExitHandlers 및 ThreadExitHandlers를 설치할 수 있습니다. 매뉴얼을 실행 중일 때, 이는 버퍼 등을 디스크로 플러시하는 것입니다.

ExitHandlers를 사용해야하는 다른 상황이 있습니까?

Tcl이 종료 될 때 Tcl_PackageUnloadProcs가 호출됩니까?

답변

1

전체 확장 ClientData는 기타 확장이 빌드 할 수있는 자체 스텁 테이블 (즉, 정확한 ABI를 나타내는 함수의 구성 목록)을 게시하려는 확장을위한 것입니다. 이것은 매우 드문 일입니다. 원하지 않는다면 NULL로 남겨 두십시오 (Tcl 코어 개발자의 메일 링리스트에 직접 연락하십시오; 우리는이 분야에서 많은 경험을 가지고 있습니다). ABI 구조이기 때문에 은 순수한 정적 데이터로 예상되므로 삭제할 필요가 없습니다. 동적 데이터는 다른 메커니즘 (예 : Tcl 인터프리터 또는 ABI를 통한 호출 기능을 통해)을 통해 전송되어야합니다.

종료 핸들러 (여러 단계로 등록 할 수 있음)는 적절한 시간에 일부 리소스를 삭제해야 할 때 사용하는 항목입니다. 일반적으로 인터프리터 (Tcl_Interp 구조체)가 삭제 될 때, 스레드가 삭제 될 때, 전체 프로세스가 중단 될 때 관심이 집중됩니다. 어떤 자원을 특별히 삭제해야합니까? 일반적으로 파일 핸들, 데이터베이스 핸들 등은 명백합니다. 세부 사항이 중요 할 때 일반적으로 대답하는 것은 어색합니다.보다 구체적인 질문을하여 맞춤 조언을 얻으십시오.

그러나 패키지 언로드 콜백은 unload 명령에 대한 응답으로 만 호출됩니다. 패키지로드 콜백과 마찬가지로, 그들은 "특수 기능 심볼"등록을 사용하고, 등록되지 않은 경우 unload 명령은 패키지 언로드를 거부합니다. 대부분의 패키지는 패키지를 사용하지 않습니다. 유스 케이스는 추가로 업그레이드 할 수있는 기능이 추가되어야하는 매우 수명이 긴 프로세스가있는 곳입니다.

+0

"매우 오래"이란 말은 수개월 또는 수년간 지속적으로 실행되는 프로그램을 의미합니다. Tcl은 주요 판매 포인트 인 이국적인 산업용 제어 시스템과 같은 장소에서 사용되는 경향이 있습니다. OTOH, 이것은 또한 이런 종류의 것을 실제로 사용하는 유일한 코드가 엄격하게 상업적 (또한 매우 전문화 된 것)이라는 것을 의미합니다 ... –