Multithreading в DLL (Firebird UDF) - Access Violation

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Multithreading в DLL (Firebird UDF) - Access Violation

Сообщение NTFS » 31.03.2008 10:11:04

Добрый день.
Написал DLL(UDF) на FreePascal.
UDF обрабатывает строки.
При компиляции в Delphi - все работает.
При компиляции в FPC 2.2.0 и использовании в FireBird 1.5.5 Classic
при одновременном вызове из двух приложений сервер падает с Access Violation. При работе с SuperServer такого не наблюдается.
ИМХО, это из-за того, что библиотека получилась не thread-safe.
Убрал все функции, используюшие кривой тип AnsiString, перешел на PChar и функции из модуля strings.
Сервер стал падать реже, но на 5-6 запусков функции все равно происходит ошибка.
try except не помогает, подозреваю, что проблема с передачей параметров.
В принципе, можно было бы списать на кривизну собственных ручек, НО: при компиляции в Delphi таких проблем нет.
Какие будут мысли?
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Сообщение NTFS » 31.03.2008 10:12:30

Прошу прощения, проблема возникает именно в SuperServer, так как он использует потоки. Опечатался :-)
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Сообщение Attid » 31.03.2008 13:26:33

если это не поможет, то не знаю
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение NTFS » 31.03.2008 13:48:36

Меня в принципе интересует, нормально ли работают потоки в DLL? На старых версиях FPC вообще нельзя было сделать UDF - сервер падал на раз. Сейчас вроде получше...
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Сообщение Bupyc » 31.03.2008 16:16:37

У меня подобная фишка была в дельфях лет 8 назад. Мною было написано мультипоточное приложение. В нём, в tread'ах использовались строки. После запуска, приложение заваливалось в потоке в произвольном месте. С этой проблемой я промучался примерно месяц. Потом понял, что это происходит из-за использования строковых операций и функций типа move, fillchar и т.д.. Полегчало только тогда, когда перешёл на работу с типом PChar. И только спустя 2-3 года я понял суть проблемы. Всё это было из-за того, что поток я создавал с помощью API CreateThread. В отличие от TThread.Create, эта функция не выставляет булевский флаг "IsMultiThread". Как я позднее выяснил, он используется в дельфёвом менеджере памяти. Там применяются примерно следующие конструкции:

Код: Выделить всё
if IsMultiThread then EnterCriticalSection(.....)


Полагаю, что проблема, описаная в начале темы, из той же серии, что была у меня.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5

Рейтинг@Mail.ru