Расширения Tcl: жизненный цикл расширений ClientData - PullRequest
2 голосов
/ 07 марта 2012

Нетривиальным собственным расширениям потребуются динамические структуры данных для каждого интерпретатора.

В настоящее время я использую Tcl_SetAssocData с ключом, соответствующим имени расширения и соответствующей подпрограмме удаления, для предотвращения этой памятиот утечки.

Однако Tcl_PkgProvideEx также позволяет записывать такую ​​информацию.Эта информация может быть получена с помощью Tcl_PkgRequireEx.Связывание структур данных расширения с его пакетом выглядит более естественным, чем в «grab-bag» AssocData;все же подпрограммы Pkg * Ex не предоставляют автоматически вызванную подпрограмму удаления.Поэтому я думаю, что мне нужно придерживаться подхода AssocData.

Для каких ситуаций были разработаны процедуры Pkg * Ex?

Кроме того, библиотека Tcl позволяет устанавливать ExitHandlers и ThreadExitHandlers.Перефразируя руководство, это для сброса буферов на диск и т. Д.

Существуют ли другие ситуации, требующие использования ExitHandlers?

Когда Tcl вызывает выход, вызывается ли Tcl_PackageUnloadProcs?

1 Ответ

1 голос
/ 08 марта 2012

Целое расширение ClientData предназначено для расширений, которые хотят опубликовать свою собственную таблицу-заглушку (т. Е. Организованный список функций, представляющих точный ABI), с которыми другие расширения могут быть построены. Это очень редкая вещь, которую хочется делать; оставьте на NULL, если вы этого не хотите (и обратитесь напрямую к списку рассылки разработчиков ядра Tcl; у нас есть небольшой опыт в этой области). Так как он предназначен для структуры ABI, он сильно должен быть чисто статическим и поэтому не нуждается в удалении. Динамические данные должны отправляться через другой механизм (например, через интерпретатор Tcl или через вызов функций через ABI).

Обработчики выхода (которые могут быть зарегистрированы на нескольких уровнях) - это то, что вы используете, когда вам нужно удалить какой-то ресурс в соответствующее время. Типичные моменты, представляющие интерес, - это когда интерпретатор (структура Tcl_Interp) удаляется, когда удаляется поток и когда весь процесс удаляется. Какие ресурсы нужно специально удалить? Ну, это обычно очевидно: дескрипторы файлов, дескрипторы баз данных и тому подобное. Вообще неловко отвечать, поскольку детали очень важны: задайте более конкретный вопрос, чтобы получить индивидуальный совет.

Однако обратные вызовы выгрузки пакетов вызываются только в ответ на команду unload. Как и обратные вызовы загрузки пакета, они используют регистрацию «символа специальной функции», и если они отсутствуют, команда unload откажется выгружать пакет. Большинство пакетов не используют их. В этом случае используются очень долгоживущие процессы, которым необходимо добавить дополнительные обновляемые функции.

...