Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как "аккурутно" вызвать fb_shutdown()? / 14 сообщений из 14, страница 1 из 1
02.02.2015, 10:58
    #38869172
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
Добрый день.
Приложение использует fb embedded FB 2.5 в качестве клиентской библиотеки для коннекта к УДАЛЕННОМУ серверу FB.

С некоторых пор при завершении приложение зависает не пару секунд, потом подает с AV.

Спасает предварительный (перед завершением приложения) вызов fb_shutdown(), в соответствии с рекомендациями.
~~~~~~~~~~~~

Ну вот. Библиотека fb embedded иногда используется, иногда нет. В зависимости от того, что делает пользователь.
Возможно, что fb embedded вообще никак не используется.

Если в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.

Отследить, был или не был коннект - тяжело: приложение большое, состоит из нескольких слабо связанных между собой dll - модулей, некоторые из модулей используют fb embedded, некоторые - нет.

Вопрос: какие действия следует выполнить, чтобы инициализировать то, что в сообщениях называется "firebird engine instance"?
...или что другое сделать...чтобы fb_shutdown() отработала без AV...


Спасибо.
...
Рейтинг: 0 / 0
02.02.2015, 11:02
    #38869176
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
try except не помог что ли?
Или долго шатдаунится?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.02.2015, 11:09
    #38869181
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
Гаджимурадов Рустам...
try except не помог что ли?
Или долго шатдаунится?

Да, долго.
И при завершении приложения (после "выгрузки" .pas юнитов, и при выгрузке "статически прилинкованных .dll"), честно говоря, хз что происходит. Вроде весь паскалевский код отработал без проблем, потом моих знаний не хватает.
...
Рейтинг: 0 / 0
02.02.2015, 11:55
    #38869248
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччДЕсли в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.И это уже в трекере ?
чччДВопрос:...или что другое сделать...чтобы fb_shutdown() отработала без AV...Написать письмо трекеру. Причём срочно, ибо 2.5.4 на носу.
...
Рейтинг: 0 / 0
02.02.2015, 12:09
    #38869280
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
hvladчччДЕсли в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.И это уже в трекере ?
чччДВопрос:...или что другое сделать...чтобы fb_shutdown() отработала без AV...Написать письмо трекеру. Причём срочно, ибо 2.5.4 на носу.

Э... я просто не уверен, что AV при вызове fb_shutdown() фактически вслед за LoadLibrary() для кого-то проблема, кроме меня.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure fbifShutdownConnect;
var
  fbClientLibHandle: Cardinal;
  fLibraryName: string;
  fb_shutdown: function(timeout: Cardinal; const reason: Integer): Integer; stdcall;
  fSaved8087CW: Word;
begin
  // Деинициализация коннекта. Метод должен быть вызван перед завершением приложения
  // !!! не в секции finalization
  fSaved8087CW := Get8087CW();
  try
    if Assigned(fbIniImplDataModue) then
      FreeAndNil(fbIniImplDataModue)
    else begin
      fLibraryName := TfbIniImplDataModue.GetFBClientLibName;
      fbClientLibHandle := LoadLibrary(PChar(fLibraryName));
      if fbClientLibHandle > 32 then begin
        fb_shutdown := GetProcAddress(fbClientLibHandle, 'fb_shutdown');
        fb_shutdown(0, 1);
        FreeLibrary(fbClientLibHandle);
      end;
    end;
  finally
    Set8087CW(fSaved8087CW)
  end;
end;



Если при завершении приложения не вызвать подобный код, то fb embedded, загруженная в "статически прилинкованной" dll вызовет AV при завершении приложения.
AV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.
...
Сейчас потыркал, и обнаружил, что необязательно коннектиться к файлу, а можно вызвать isc_service_attach/isc_service_detach. Тогда вызов fb_shutdown() тоже не влечет AV.
...

Как все это описать?
...
Рейтинг: 0 / 0
02.02.2015, 12:15
    #38869292
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччД,

дык подключение к сервису - это всё равно подключение
...
Рейтинг: 0 / 0
02.02.2015, 12:18
    #38869300
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
Симонов ДенисчччД,

дык подключение к сервису - это всё равно подключение

Зато не требуется указывать файл базы, и, следовательно он не лочится, что важно в случае, когда fb embedded работает в терминальной сессии: http://www.sql.ru/forum/1139728/firebird-embedded-2-5-v-terminalnoy-sessii-win-2003-sever-2012-server-kak
...
Рейтинг: 0 / 0
02.02.2015, 12:42
    #38869360
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
Аллё, дяденьки.

Ну так как же лучше облачить мои страдания в трекеропригодный вид? Чтобы ничего лишнего...
...
Рейтинг: 0 / 0
02.02.2015, 12:47
    #38869368
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччДAV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.В какой момент вызывается этот код ?

чччДКак все это описать?Небольшое тестовое приложение можешь сделать ?
...
Рейтинг: 0 / 0
02.02.2015, 12:47
    #38869370
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччД,

ну так и напиши вызов fb_shutdown приводит к AV, если не было ни одного коннекта или вызова isc_service_attach

Не волнуйся там тебя поправят если что
...
Рейтинг: 0 / 0
02.02.2015, 12:50
    #38869373
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
hvladчччДAV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.В какой момент вызывается этот код ?

чччДКак все это описать?Небольшое тестовое приложение можешь сделать ?
Код вызывается перед завершением приложения. После всех дисконнектов (если они были).

Тестовое: Delphi 2007 - пойдет?
...
Рейтинг: 0 / 0
02.02.2015, 12:54
    #38869380
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччДКод вызывается перед завершением приложенияВ каком месте ты его вызываешь ?
Где, с твоей точки зрения, находится завершение приложения ?

чччДТестовое: Delphi 2007 - пойдет?Наверное. Если там ещё и не будет левых компонент (не из поставки Delphi), то вообще прекрасно.
...
Рейтинг: 0 / 0
02.02.2015, 16:28
    #38869641
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
чччД
Код: sql
1.
2.
        fb_shutdown := GetProcAddress(fbClientLibHandle, 'fb_shutdown');
        fb_shutdown(0, 1);

А почему fb_shutdown не проверяется на нулл ?

В общем, я не могу это воспроизвести. Вот как я пробовал:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
program fbShutdown;

{$APPTYPE CONSOLE}

uses
  SysUtils, WIndows;

var
  hDll : THandle;
  buff : array[0..255] of char;
  fShut : function(a, b : cardinal) : Cardinal; stdcall;
  fCVer : procedure(buff : PChar); stdcall;
begin
  hDll := LoadLibrary(PChar(Paramstr(1)));
  if hDll = 0
  then begin
    Writeln(Format('Error loading DLL : %d (%s)', [GetlastError(), SysErrorMessage(GetlastError())]));
    Exit;
  end;

  fCVer := GetProcAddress(hDll, 'isc_get_client_version');
  if Assigned(fCVer)
  then begin
    fCVer(buff);
    Writeln('Client version : ', buff);
  end;

  fShut := GetProcAddress(hDll, 'fb_shutdown');
  if Assigned(fShut)
  then fShut(0, 1);

  FreeLibrary(hDll);
end.

полный путь к тестируемой DLL указывается в ком. строке.
...
Рейтинг: 0 / 0
02.02.2015, 16:36
    #38869653
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "аккурутно" вызвать fb_shutdown()?
hvlad,

я скачал последний билд fb 2.5.4.26831 - баг пропал... еще погоняю, может, чего нарою...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как "аккурутно" вызвать fb_shutdown()? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]