Начало » Использование СУБД » Firebird, HQbird, InterBase » Параметры firebird_udr_plugin (Хочу все знать!)
Параметры firebird_udr_plugin [сообщение #2229] |
Mon, 15 May 2023 17:19 |
shalamyansky
Сообщений: 150 Зарегистрирован: August 2022
|
Senior Member |
|
|
Вопрос прежде всего к разработчикам движка udr_engine, если они сюда заглядывают, а также к Денису Симонову, как человеку, глубоко разобравшемуся с использованием этого движка.
Вот так описана точка входа в модуль udr
Показать скрытый текст
UdrCppEngine.h
FB_BOOLEAN* FB_UDR_PLUGIN_ENTRY_POINT(::Firebird::IStatus* status, FB_BOOLEAN* theirUnloadFlag, ::Firebird::IUdrPlugin* udrPlugin);
Интересует смысл и предполагаемое правильное использование параметра theirUnloadFlag, а также возвращаемого значения (далее в коде именуемого как myUnloadFlag).
Файл UdrCppEngine.h предлагает шаблон реализации точки входа:
Показать скрытый текст
UdrCppEngine.h
extern "C" FB_DLL_EXPORT FB_BOOLEAN* FB_UDR_PLUGIN_ENTRY_POINT(::Firebird::IStatus* status, \
FB_BOOLEAN* theirUnloadFlag, ::Firebird::IUdrPlugin* udrPlugin) \
{ \
::Firebird::Udr::FactoryRegistration::finish(status, udrPlugin); \
\
class UnloadDetector \
{ \
public: \
UnloadDetector(FB_BOOLEAN* aTheirUnloadFlag, ::Firebird::IUdrPlugin* aUdrPlugin) \
: myUnloadFlag(FB_FALSE), \
theirUnloadFlag(aTheirUnloadFlag), \
udrPlugin(aUdrPlugin) \
{ \
} \
\
~UnloadDetector() \
{ \
if (!myUnloadFlag) \
*theirUnloadFlag = FB_TRUE; \
} \
\
FB_BOOLEAN myUnloadFlag; \
FB_BOOLEAN* theirUnloadFlag; \
::Firebird::IUdrPlugin* udrPlugin; \
}; \
\
static UnloadDetector unloadDetector(theirUnloadFlag, udrPlugin); \
\
return &unloadDetector.myUnloadFlag; \
}
Такую же логику старта и завершения повторяет и Денис в своей статье, посвященной созданию UDR на Pascal, а также, вероятно, и прочие писатели UDR, к коим примкнул и автор этих строк.
Повторить-то я повторил, но смысл не понял. Что означают оба этих флага, кто когда какой флаг может и должен читать и кто когда какой флаг должен устанавливать? Это оповещение о выгрузке, разрешение выгрузки, запрет выгрузки? От кого кому?
В файле UdrEngine.cpp можно увидеть события со стороны движка, но понимания мне это не добавило:
Показать скрытый текст
UdrEngine.cpp
UdrPluginImpl* Engine::loadModule(ThrowStatusWrapper* status, IRoutineMetadata* metadata, PathName* moduleName, string* entryPoint)
{
...
UdrPluginImpl* udrPlugin = FB_NEW UdrPluginImpl(*moduleName, module);
udrPlugin->theirUnloadFlag = entryPoint(status, &udrPlugin->myUnloadFlag, udrPlugin);
...
...
}
class UdrPluginImpl : public VersionedIface<IUdrPluginImpl<UdrPluginImpl, ThrowStatusWrapper> >
{
public:
UdrPluginImpl(const PathName& aModuleName, ModuleLoader::Module* aModule)
: moduleName(*getDefaultMemoryPool(), aModuleName),
module(aModule),
myUnloadFlag(FB_FALSE),
theirUnloadFlag(NULL),
functionsMap(*getDefaultMemoryPool()),
proceduresMap(*getDefaultMemoryPool()),
triggersMap(*getDefaultMemoryPool())
{
}
~UdrPluginImpl()
{
if (myUnloadFlag)
return;
*theirUnloadFlag = FB_TRUE;
{
GenericMap<Pair<Left<string, IUdrFunctionFactory*> > >::Accessor accessor(&functionsMap);
for (bool cont = accessor.getFirst(); cont; cont = accessor.getNext())
accessor.current()->second->dispose();
}
{
GenericMap<Pair<Left<string, IUdrProcedureFactory*> > >::Accessor accessor(&proceduresMap);
for (bool cont = accessor.getFirst(); cont; cont = accessor.getNext())
accessor.current()->second->dispose();
}
{
GenericMap<Pair<Left<string, IUdrTriggerFactory*> > >::Accessor accessor(&triggersMap);
for (bool cont = accessor.getFirst(); cont; cont = accessor.getNext())
accessor.current()->second->dispose();
}
}
FB_BOOLEAN myUnloadFlag;
FB_BOOLEAN* theirUnloadFlag;
};
Если кто паче чаяния решит вникнуть, имейте в виду, что флаги myUnloadFlag и theirUnloadFlag со стороны движка и модуля имеют обратный смысл: то, что в файле UdrEngine.cpp названо myUnloadFlag, в файле UdrCppEngine.h называется theirUnloadFlag, и наоборот. Техника именования очень способствует тренировке мозгов по распутыванию сложных зависимостей.
Более означенные флаги нигде не используются. Вся логика сокрыта (открыта) в приведенных фрагментах, но я её не понимаю. Прошу помощи.
Исходные тексты взяты из Firebird-4.0.2.2816-0/src.
|
|
|
|
|
Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
От: sim_84 - Mon, 15 May 2023 18:44
|
|
|
Re: Параметры firebird_udr_plugin
От: sim_84 - Mon, 15 May 2023 18:52
|
|
|
Re: Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
От: sim_84 - Mon, 15 May 2023 18:59
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Mon, 15 May 2023 23:16
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Tue, 16 May 2023 00:34
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Tue, 16 May 2023 12:12
|
|
|
Re: Параметры firebird_udr_plugin
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Tue, 16 May 2023 14:28
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Tue, 16 May 2023 14:45
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Wed, 17 May 2023 00:42
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Wed, 17 May 2023 09:20
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Wed, 17 May 2023 14:31
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Wed, 17 May 2023 14:48
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Wed, 17 May 2023 15:34
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Wed, 17 May 2023 16:27
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Wed, 17 May 2023 17:20
|
|
|
Re: Параметры firebird_udr_plugin
От: hvlad - Wed, 17 May 2023 19:22
|
|
|
Re: Параметры firebird_udr_plugin
От: SD - Thu, 18 May 2023 01:53
|
Переход к форуму:
Текущее время: Thu Dec 19 08:38:17 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01818 секунд
|