DevCon bits, WPS hangs on shutdown, start/quit of app

User avatar
Eugene Gorbunoff
Site Admin
Posts: 685
Joined: Sat Apr 09, 2005 11:18
Location: St.Petersburg, Russia

DevCon bits, WPS hangs on shutdown, start/quit of app

Postby Eugene Gorbunoff » Fri Mar 19, 2010 17:51

From: Capricorn
Date: 2008

Проблема в вашей WPS-программе: WPS виснет при закрытии системы; WPS виснет при старте/остановке программы.

Обратите внимание на механизм мутексов в WPS, SMP.

В WPS есть внутренний механизм мутексов. Для каждого объекта создаётся мутекс. Те функции, которые что-то меняют в данных объекта, занимают этот мутекс, а после того, как произведут изменения - освобождают его.
Так вот: большинство этих функций занимают мутекс, указав INDEFINITE_WAIT, так что, если данная функция вызывается во время исполнения другой функции, которая заняла данный мутекс и ждёт завершения этой функции, мы имеем мёртвый вис всего WPS.
Такое происходит, например, в момент открытия/закрытия некоторых объектов, например когда происходит запуск или завершение программы. Причём, занимается мутекс, не самого объекта, а объекта того исполнимого файла, который запускает объект-программа. Также странно ведёт себя объект WorkFrame V3 Project (проект ViasualAge C++ 3.0).

Теперь, если во время выполнения данного метода бкдет вызван другой метод, который тоже займёт мутекс, причём сделает это из другого треда (следует помнить что WPS - мультитредовое приложение и треды плодит по каждому чиху), мы получим мёртвый вис WPS, т. к. мутекс уже занят данным тредом, и освобаждать мы его не собираемся, пока не выполнится тот самый метод, который мы только что вызвали. Таким методом может быть например, метод wpQueryProgDetails объекта WPProgram.

В случае, если удаётся выяснить, какой-же метод занимает мутекс, можно попытаться организовать работу так, чтобы не вызывать этот метод тогда, когда мутекс занят. Однако, бывают случаи, когда установить это довольно сложно, поскольку в SOM всё это организовано довольно непрозрачно.

Наиболее простой способ заткнуть данное место, вставив в начале того метода, внутри которого происходит зависание, проверку, занят ли мутекс данным тредом. В случае, если да - смело продолжать работу, а в случае, если нет - попытаться занять мутекс. Но пытаться занять его не до бесконечности, а например, в течение 100мс. Если не удалось - просто вернуть ошибку. Если же удалось - не забыть освободить занятый мутекс. Таким образом, объект будет в некоторых случаях выдавать ошибку (или как-то не так отрабатывать), но по крайней мере, не будет намертво вешать WPS!

Если кто-то знает способ определить, в каком методе происходит зависание (если этот метод не перекрыт и не вызывается явно) - поделитесь своими мыслями!

(thx Capricorn)

Return to “Developers / Разработчики”

Who is online

Users browsing this forum: No registered users and 1 guest

cron