2014-01-23 2 views
0

У меня есть некоторая проблема с Tcl_DeleteInterp() API (on solaris). Я использовал этот Tcl_DeleteInterp() в своем приложении для удаления интерпретатора. Странная вещь, которую я нашел, - это процесс, который использует этот API, около 20 минут. Я приложил процесс с помощью команды truss и обнаружил, что процесс продолжает выполнять нижеуказанные функции почти 20 минут.Понимание Tcl_DeleteInterp() API

15.6541 0.0002 -> libtcl8.4:Tcl_DeleteInterp(0x41748, 0x0, 0x0, 0x0) 
15.6580 0.0039 -> libc:free(0x288f8, 0x0, 0x0, 0x0) 
15.6583 0.0003 -> libc:mutex_unlock(0xff0424e8, 0x0, 0x0, 0x0) 
15.6584 0.0001 <- libc:free() = 0 
15.6588 0.0004 -> libc:free(0x474b0, 0x0, 0x0, 0x0)* 
... 
... 

Может кто-нибудь помочь мне в этом, почему функция Tcl_DeleteInterp вызывает эти функции? Я также проверил реализацию, выполненную для Tcl_DeleteInterp(), но не нашел никакой подсказки.

Благодаря

ответ

0

Tcl_DeleteInterp удаляет контекст интерпретатор Tcl. Как часть этого, он разрушает пространства имен, команды и переменные в этом интерпретаторе (Tcl не имеет true globals, все всегда локально для конкретного контекста интерпретатора). Это удаление, в свою очередь, происходит с выходом памяти обратно в основной диспетчер памяти и, возможно, в ОС; поэтому free() называется; его можно было бы косвенно назвать в некоторых конфигурациях, но он будет вызван. (Если в контексте интерпретатора есть активное выполнение, то есть вызов Tcl_Eval() или одна из связанных с ним функций - некоторые из них будут отложены до завершения исполнения.) Есть также некоторые обратные вызовы (ну, довольно много их), которые могут быть установлены для обнаружения различных удалений; те могут (и, скорее всего, будут) освобождать вещи.

Я не знаю, что вызывает зависания, но, по-видимому, у вас есть еще один поток, который забивает распределитель системной памяти, сохраняя глобальную блокировку для распределителя памяти слишком жестко. Если это так, это довольно неприятно. В таком случае вам может быть лучше попытаться обновиться до потоковой версии Tcl 8.5 или 8.6 (я бы порекомендовал, чтобы в любом случае 8,4 не поддерживали некоммерческую поддержку), поскольку в ней используется специализированный распределитель памяти, t распределять (и освобождать) почти так же из глобального пула памяти. I не знаю, что это исправит вещи; Я подозреваю, что ошибка не в реализации Tcl, а в другом коде. (Это, безусловно, не в сценарии Tcl, если у вас нет какого-нибудь причудливого кода расширения, который вызывает проблемы.)

+0

Спасибо за ваш ответ Donal – sakthivp

Смежные вопросы