Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависание регистрации событий по xnet протоколу / 25 сообщений из 40, страница 1 из 2
11.02.2021, 16:05
    #40044494
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Есть такой код
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    FEvents: PByte;
    FResults: PByte;


constructor TEventBlock.Create(AOwner: TMyIBEvents; AOffset, ACount: Integer);
var
  Li: Integer;
  LEventStrs: array[0..IB_MAX_EVENT_BLOCK - 1] of AnsiString;
  LEvents: array[0..IB_MAX_EVENT_BLOCK - 1] of PByte;
begin
  inherited Create;
  FOwner := AOwner;
  FInitEvent := CreateEvent(nil, False, False, nil);
  try
    for Li := 0 to FCount - 1 do begin
      LEventStrs[Li] := AnsiString(FOwner.Events[AOffset + Li]);
      LEvents[Li] := PByte(LEventStrs[Li]);
    end;
    FLen := FOwner.GDSLibrary.isc_event_block(
      FEvents,
      FResults,
      FCount,
      LEvents
    );
    FillChar(FResults^, FLen, 0);
    QueueEvent;
    WaitForSingleObject(FInitEvent, INFINITE);
    QueueEvent;
  finally
    CloseHandle(FInitEvent);
  end;
end;

procedure TEventBlock.QueueEvent;
begin
  FOwner.Database.Call(
    FOwner.GDSLibrary.isc_que_events(
      StatusVector,
      @FOwner.Database.Handle,
      @FID,
      FLen,
      FEvents,
      @EventCallback,
      PVoid(Self)
    ),
    True
  );
end;

procedure EventCallback(APtr: Pointer; ALength: Short; AUpdated: PAnsiChar); cdecl;
begin
   ...........
  SetEvent(FInitEvent);
end;


Происходит зависание на выделенной строке, т.к. не вызывается EventCallback. Вообще. Это происходит при коннекте по xnet. Если я заменяю xnet:// на localhost: все работает.

Если после зависания остановить службу Firebird, то EventCallback вызывается с параметрами (APtr, 0, nil);

Версия сервераServer Version: WI-V3.0.7.33374 Firebird 3.0
Server Implementation: Firebird/Windows/AMD/Intel/x64клиент 32 битный.

Где моя ошибка? Коду по работе с событиями уже много лет. Правда работал он только по TCP протоколу и с Interbase.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
11.02.2021, 17:04
    #40044524
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_Где моя ошибка?

Как минимум - FillChar(FResult) там лишний. И есть подозрение, что клиент у тебя не той
системы, поскольку такой баг замечен в Interbase 7.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2021, 17:44
    #40044537
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Dimitry Sibiryakov
Как минимум - FillChar(FResult) там лишний
В смысле не нужен или вреден?
Dimitry Sibiryakov
. И есть подозрение, что клиент у тебя не той системы
Код: pascal
1.
2.
3.
4.
    LHandle := GetModuleHandle(PChar(FOwner.GDSLibrary.LibraryName));
    LName := GetModuleName(LHandle);
    GetProductVersion(LName, LMajor, LMinor, LBuild);
    MessageBox(0, PChar(Format('%s: %u.%u.%u', [LName, LMajor, LMinor, LBuild])), '', 0);

C:\WINDOWS\SYSTEM32\fbclient.dll: 3.0.7Да и послал бы меня клиент IB с xnet протоколом
...
Рейтинг: 0 / 0
11.02.2021, 18:07
    #40044553
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Dimitry Sibiryakov
Как минимум - FillChar(FResult) там лишний.
Убрал, ничего не изменилось
...
Рейтинг: 0 / 0
11.02.2021, 18:15
    #40044558
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_В смысле не нужен или вреден?

Как минимум - не нужен. В зависимости от того как у тебя написал callback, может быть и
вреден. Event block имеет внутреннюю структуру, включающую в себя имена событий, и
обнулять его целиком чревато для функций, которым ты его потом будешь скармливать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2021, 18:24
    #40044564
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Dimitry Sibiryakov
Как минимум - не нужен. В зависимости от того как у тебя написал callback, может быть и вреден.
В коллбеке у меня так
Код: pascal
1.
2.
if AUpdated <> nil then begin
  Move(AUpdated^, FResults^, FLen);

Я не знаю откуда это пошло. Код довольно старый и писался для Interbase. Тут или копипаста откуда-то или обход какого-то бага. Уже не скажу.

Но сейчас проблема в том, что для xnet коллбек не вызывается вообще.
...
Рейтинг: 0 / 0
11.02.2021, 18:37
    #40044575
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
del
...
Рейтинг: 0 / 0
11.02.2021, 18:40
    #40044576
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_Но сейчас проблема в том, что для xnet коллбек не вызывается вообще.

Теоретически это даже может быть правильным поведением: не произошло событие - не
вызывается коллбэк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2021, 18:42
    #40044577
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Dimitry Sibiryakov
Теоретически это даже может быть правильным поведением: не произошло событие - не вызывается коллбэк.
Да. Но во первых всегда требовался двойной вызов isc_que_events на старте. И при возникновении события коллбек все равно не вызывается
...
Рейтинг: 0 / 0
11.02.2021, 18:50
    #40044583
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_Но во первых всегда требовался двойной вызов isc_que_events на старте.

Это-то да, но оно могло быть и простым совпадением для случая когда у сервера счётчики
событий уже прокручены от нуля.

_Vasilisk_И при возникновении события коллбек все равно не вызывается

И даже после второго события (поскольку у тебя там сразу идёт второе ожидание)?
Тогда это точно баг. Как и в случае с Interbase, мой ответ "не используйте xnet".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2021, 19:19
    #40044595
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Dimitry Sibiryakov
И даже после второго события (поскольку у тебя там сразу идёт второе ожидание)?
Я в отладчике поставил брекпойнт в коллбеке. Коллбек не вызывается вообще. Три события послал. Более того, если убрать ожидание и сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    FLen := FOwner.GDSLibrary.isc_event_block(
      {$IF IBX_Version < 19}@{$IFEND}
      FEvents,
      {$IF IBX_Version < 19}@{$IFEND}
      FResults,
      FCount,
      LEvents
    );
    FillChar(FResults^, FLen, 0);
    QueueEvent;
//    WaitForSingleObject(FInitEvent, INFINITE);
//    QueueEvent;

то зависания нет, что логично, но коллбек вызывается только при дисконнекте от базы. События игнорируются
Dimitry Sibiryakov
Тогда это точно баг.
90%, что он появился в 3.0.7.
Хотя вот сейчас проверили на другой машине тоже с 3.0.7, правда там сервер 32-х битный - все работает.

Я боюсь сейчас в трекер соваться, без точных условий повторения
Dimitry Sibiryakov
мой ответ "не используйте xnet".
Ну обещали же новый и хороший протокол
...
Рейтинг: 0 / 0
11.02.2021, 19:25
    #40044597
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_90%, что он появился в 3.0.7.
Хотя вот сейчас проверили на другой машине тоже с 3.0.7, правда там сервер 32-х битный -
все работает.

Как я уже сказал, эта проблема впервые была замечена на IB7, то есть существует
вероятность, что этот баг старый и поселился ещё в локальном протоколе. А в xnet его
портировали не глядя.

_Vasilisk_Ну обещали же новый и хороший протокол

Он новый и хороший, но когда в нём починили колбэки на шифрование базы (и починили ли
вообще) - я не помню. Очевидно, колбэки событий провалились в ту же яму с багами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2021, 19:25
    #40044598
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_,

воспроизводимый пример есть ?
...
Рейтинг: 0 / 0
11.02.2021, 19:37
    #40044606
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
hvlad
воспроизводимый пример есть ?
Могу написать. На Delphi можно или C only?
...
Рейтинг: 0 / 0
11.02.2021, 21:01
    #40044632
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Собрал тест на VC - работает.

Ушел сравнивать заголовки
...
Рейтинг: 0 / 0
11.02.2021, 22:04
    #40044645
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_
hvlad
воспроизводимый пример есть ?
Могу написать. На Delphi можно или C only?
На том, на чём воспроизводится :)
...
Рейтинг: 0 / 0
11.02.2021, 23:49
    #40044668
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
hvlad
На том, на чём воспроизводится :)
Переписал тестовый пример с Си на Делфи - работает, зараза.

Завтра буду копать дальше.
...
Рейтинг: 0 / 0
12.02.2021, 22:37
    #40045003
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Итак, воспроизводимый пример

Импорты
Код: 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.
const
  fbclient = 'fbclient.dll';

function isc_attach_database(status_vector            : PISC_STATUS;
                               db_name_length           : Short;
                               db_name                  : PByte;
                               db_handle                : PISC_DB_HANDLE;
                               parm_buffer_length	  : Short;
                               parm_buffer              : PByte): ISC_STATUS; stdcall; external fbclient;
function isc_detach_database(status_vector: PISC_STATUS; db_handle : PISC_DB_HANDLE): ISC_STATUS; stdcall; external fbclient;
function isc_print_status(AStatus: PISC_STATUS): ISC_STATUS; stdcall; external fbclient;
function isc_event_block(var EventBuffer : PByte; var ResultBuffer: PByte; IDCount: UShort;
  Event1, Event2, Event3, Event4, Event5, Event6, Event7, Event8, Event9,
  Event10, Event11, Event12, Event13, Event14, Event15: PByte): ISC_LONG; cdecl; external fbclient;
function isc_que_events(
       status_vector             : PISC_STATUS;
       db_handle                 : PISC_DB_HANDLE;
       event_id                  : PISC_LONG;
       length                    : Short;
       event_buffer              : PByte;
       event_function            : TISC_CALLBACK;
       event_function_arg        : PVoid): ISC_STATUS; stdcall; external fbclient;
procedure isc_event_counts(
       status_vector             : PUISC_LONG;
       buffer_length             : Short;
       event_buffer              : PByte;
       result_buffer             : PByte); stdcall; external fbclient;
function isc_cancel_events(status_vector            : PISC_STATUS;
                               db_handle                : PISC_DB_HANDLE;
                               event_id                 : PISC_LONG): ISC_STATUS; stdcall; external fbclient;


функция ConnectToDB
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
threadvar
  status_vector: array[0..19] of ISC_STATUS;

function AddDPBVal(var ADPB: PByte; AValue: Byte): PByte; overload;
begin
  ADPB^ := AValue;
  Inc(ADPB);
  Result := ADPB;
end;

function AddDPBVal(var ADPB: PByte; AName: Byte; AValue: PAnsiChar): PByte; overload;
var
  LLen: Byte;
begin
  AddDPBVal(ADPB, AName);
  LLen := StrLen(AValue);
  AddDPBVal(ADPB, LLen);
  Move(AValue^, ADPB^, LLen);
  Inc(ADPB, LLen);
  Result := ADPB;
end;

function AddDPBVal(var ADPB: PByte; AName, AValue: Byte): PByte; overload;
begin
  AddDPBVal(ADPB, AName);
  AddDPBVal(ADPB, 1);
  AddDPBVal(ADPB, AValue);
  Result := ADPB;
end;

function IsFBError: Boolean;
begin
  Result := (status_vector[0] = 1) and (status_vector[1] <> 0);
end;

function CheckFBSuccess: Boolean;
begin
  if IsFBError then begin
    isc_print_status(@status_vector);
    Result := False;
  end else
    Result := True;
end;

function ConnectToDB(AName: PAnsiChar): TISC_DB_HANDLE;
var
  LDPBBuf: array[Byte] of Byte;
  LDPB: PByte;
  LDPBLength: SmallInt;
begin
  LDPB := @LDPBBuf[0];
  AddDPBVal(LDPB, isc_dpb_version1);

  AddDPBVal(LDPB, isc_dpb_user_name, 'SYSDBA');
  AddDPBVal(LDPB, isc_dpb_password, 'masterkey');

  LDPBLength := NativeUInt(LDPB) - NativeUInt(@LDPBBuf[0]);
  Result := nil;

  isc_attach_database(@status_vector[0], StrLen(AName), PByte(AName), @Result, LDPBLength, @LDPBBuf[0]);
  if IsFBError then
    Result := nil;
end;


EventCallback
Код: 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.
type
  TEventData = record
    Event: PByte;
    Result: PByte;
    hEvent: THandle;
  end;
  PEventData = ^TEventData;

procedure EventCallback(AData: Pointer; ALength: Word; AUpdated: PByte); cdecl;
var
  LData: PEventData;
begin
  if (ALength = 0) or (AUpdated = nil) then
    Exit;
  LData := AData;
  Move(AUpdated^, LData^.Result^, ALength);
  isc_event_counts(@status_vector[0], ALength, LData^.Event, LData^.Result);
  if LData^.hEvent <> 0 then begin
    SetEvent(LData^.hEvent);
    Exit;
  end;
  if status_vector[0] <> 0 then
    MessageBox(0, 'Event', '', 0);
end;


функция WaitEvent
Код: 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.
function WaitEvent(ADB: TISC_DB_HANDLE; const AEvents: array of PAnsiChar): ISC_LONG;
var
  LData: PEventData;
  LLen: SmallInt;
  LEvents: array of PByte;
begin
  LData := VirtualAlloc(nil, SizeOf(LData^), MEM_COMMIT, PAGE_READWRITE);
  LLen := Length(AEvents);
  SetLength(LEvents, LLen);
  Move(AEvents[0], LEvents[0], LLen * SizeOf(AEvents[0]));
  LLen := isc_event_block(LData^.Event, LData^.Result, Length(AEvents),
    LEvents[0], LEvents[1], LEvents[2], LEvents[3], LEvents[4], LEvents[5],
    LEvents[6], LEvents[7], LEvents[8], LEvents[9], LEvents[10], LEvents[11],
    LEvents[12], LEvents[13], LEvents[14]
  );
  LData^.hEvent := CreateEvent(nil, False, False, nil);
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Exit(0);
  WaitForSingleObject(LData^.hEvent, INFINITE);
  CloseHandle(LData^.hEvent);
  LData^.hEvent := 0;
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Result := 0;
end;


Тестирующая функция
Код: 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.
27.
28.
29.
const
  CEventNames: array[0..7] of AnsiString = (
    'EVENT_UPD_SUBS',
    'EVENT_POSTS_AU',
    'EVENT_POSTS_AU_NEW',
    'EVENT_PLAN_REPORT',
    'EVENT_TSK_COMMAND',
    'INS_REGISTRATION_EVENT',
    'EVENT_QUEUE_CFG',
    'EVENT_QUEUE_DELTA_CFG'
  );

procedure TestApi;
var
  LDB: TISC_DB_HANDLE;
  LEvent: ISC_LONG;
  Li: Integer;
  LData: array[0..Length(CEventNames) - 1] of PAnsiChar;
begin
  LDB := ConnectToDB('xnet://D:\DB\Temp.fdb');
  if not CheckFBSuccess then
    Exit;
  for Li := 0 to Length(CEventNames) - 1 do
    LData[Li] := PAnsiChar(CEventNames[Li]);
  LEvent := WaitEvent(LDB, LData);
  Sleep(1000);
  isc_cancel_events(@status_vector[0], @LDB, @LEvent);
  isc_detach_database(@status_vector[0], @LDB);
end;


вызов всего этого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit4 in 'Unit4.pas';

begin
  try
    TestApi;
  except
    on E: Exception do
      Writeln(E.Message);
  end;
  Write('Press <ENTER>...');
  Readln;
end.


Зависания происходят в функции WaitEvent на выделенной строке

Весь проект в аттаче.

Примечания:
1. Иногда, один раз из 20-30 запусков после первого вызова isc_que_events коллбек вызывается и зависания не происходит
2. Имена событий должны быть строго такими. При уменьшении числа событий или именах Test1 .. Test8 все работает
3. Этот же код с этими же событиями замечательно работает в Visual Studio
...
Рейтинг: 0 / 0
12.02.2021, 23:48
    #40045012
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_,

exe давай, мне нечем это компилировать.
И не нужно зашивать имя БД в код, неужели так трудно его с ком. строки взять ?
...
Рейтинг: 0 / 0
13.02.2021, 00:21
    #40045020
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
hvlad
exe давай, мне нечем это компилировать.
Пока отбой. Без отладчика эта штука начала стабильно работать. Буду еще искать. Понять бы куда смотреть.

Какая-то явная беда в синхронизации потоков

hvlad
неужели так трудно его с ком. строки взять ?
Не трудно. Уже переделал.
...
Рейтинг: 0 / 0
13.02.2021, 01:14
    #40045021
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_,

пока что мне совсем не нравится вызов isc_event_block с неопределёнными значениями LEvents[8] - LEvents[14].
...
Рейтинг: 0 / 0
13.02.2021, 01:30
    #40045023
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Вместо всей этой байды с ивентом можно просто первым вызвать isc_wait_event(). Всё то же
самое, но "под ковриком".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.02.2021, 20:19
    #40045098
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
hvlad
пока что мне совсем не нравится вызов isc_event_block с неопределёнными значениями LEvents[8] - LEvents[14].
Маловероятно, но допустим
Dimitry Sibiryakov
Вместо всей этой байды с ивентом можно просто первым вызвать isc_wait_event().
Спасибо. Второй раз ты мне советуешь эту функцию и второй раз я не могу ее найти. Потому что называется она isc_wait_ for _event

С этой функцией вроде получилось стабильно завешивать. Итак, обновленный код WaitEvent
Код: 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.
function WaitEvent(ADB: TISC_DB_HANDLE; const AEvents: array of PAnsiChar): ISC_LONG;
var
  LData: PEventData;
  LLen: SmallInt;
  LEvents: array of PByte;
begin
  LData := VirtualAlloc(nil, SizeOf(LData^), MEM_COMMIT, PAGE_READWRITE);
  LLen := Length(AEvents);
  if LLen > 15 then
    LLen := 15;
  SetLength(LEvents, 15);
  FillChar(LEvents[0], Length(LEvents) * SizeOf(AEvents[0]), 0);
  Move(AEvents[0], LEvents[0], LLen * SizeOf(AEvents[0]));
  LLen := isc_event_block(LData^.Event, LData^.Result, Length(AEvents),
    LEvents[0], LEvents[1], LEvents[2], LEvents[3], LEvents[4], LEvents[5],
    LEvents[6], LEvents[7], LEvents[8], LEvents[9], LEvents[10], LEvents[11],
    LEvents[12], LEvents[13], LEvents[14]
  );
  Writeln('Before isc_wait_for_event');
  isc_wait_for_event(@status_vector[0], @ADB, LLen, LData^.event, LData^.Result);
  Writeln('After isc_wait_for_event');
  if not CheckFBSuccess then
    Result := 0;
  isc_event_counts(@status_vector[0], LLen, LData^.Event, LData^.Result);
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Result := 0;
end;


Вот откомпилированный файл

Запускать
Код: powershell
1.
project1.exe xnet://...



Блин! Решил продублировать код в VS. Теперь он без дебаггера опять перестал зависать. При том, что я его не трогал
...
Рейтинг: 0 / 0
13.02.2021, 21:03
    #40045104
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
Отладчик, в момент зависания на isc_wait_for_event показывает следующие стеки:

Главный поток
:7736171c ntdll.NtWaitForSingleObject + 0xc
:762404e2 KERNELBASE.WaitForSingleObject + 0x12
:6b6c0470 ; C:\WINDOWS\SysWOW64\fbclient.dll
:02b90b8c
Два дополнительных потока, которые появились после вызова isc_wait_for_event
:7736171c ntdll.NtWaitForSingleObject + 0xc
:762404e2 KERNELBASE.WaitForSingleObject + 0x12
:6b6e468a ; C:\WINDOWS\SysWOW64\fbclient.dll
Второй поток без стека, но остановлен на функции ntdll.RtlUserThreadStart

fbclient.dll версии 3.0.7.33374 загружен по адресу 0x6B61000

Максимально близко к адресу 0x6b6e468a находится функция isc_start_transaction по адресу 0x6B6930A0
...
Рейтинг: 0 / 0
13.02.2021, 22:58
    #40045138
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание регистрации событий по xnet протоколу
_Vasilisk_
Второй поток
Это порождение дебаггера. Можно не обращать внимания
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависание регистрации событий по xnet протоколу / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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