Добрый день.
Написал 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 таких проблем нет.
Какие будут мысли?
Multithreading в DLL (Firebird UDF) - Access Violation
Модератор: Модераторы
У меня подобная фишка была в дельфях лет 8 назад. Мною было написано мультипоточное приложение. В нём, в tread'ах использовались строки. После запуска, приложение заваливалось в потоке в произвольном месте. С этой проблемой я промучался примерно месяц. Потом понял, что это происходит из-за использования строковых операций и функций типа move, fillchar и т.д.. Полегчало только тогда, когда перешёл на работу с типом PChar. И только спустя 2-3 года я понял суть проблемы. Всё это было из-за того, что поток я создавал с помощью API CreateThread. В отличие от TThread.Create, эта функция не выставляет булевский флаг "IsMultiThread". Как я позднее выяснил, он используется в дельфёвом менеджере памяти. Там применяются примерно следующие конструкции:
Полагаю, что проблема, описаная в начале темы, из той же серии, что была у меня.
Код: Выделить всё
if IsMultiThread then EnterCriticalSection(.....)
Полагаю, что проблема, описаная в начале темы, из той же серии, что была у меня.
