Внешняя DLL + CreateDataSource + Lua - стек

Страницы: 1
RSS
Внешняя DLL + CreateDataSource + Lua - стек
 
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились.
Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
 
полный пример в студию.
 
Цитата
Дмитрий пишет:
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились.
Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Добрый день.
Сообщите версию терминала, на которой проводили исследования.
 
Цитата
Michael Bulychev пишет:
Цитата
Дмитрий пишет:
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились.
Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Добрый день.
Сообщите версию терминала, на которой проводили исследования.
6.16.1.15
 
Вот функция в Lua скрипте. При первом запуске она подписывается на сделки, при всех последующих просто выводит Size()
Код
tds = {}
function SubscribeAllTrades(classcode, seccode, loadalltradesafternum)    
   local gcsck = GetClassSecCodeKey(classcode, seccode)

   if gcsck == "" then
      return 0
   else         
      if tds[gcsck] == nil then      
         local ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         if ds == nil then return 0 end
         ds:SetEmptyCallback()
         sleep(50)
         ds:Close()
         ds = nil
         ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         ds:SetEmptyCallback()
         sleep(50)
         ds:Close()
         ds = nil
         ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         ds:SetEmptyCallback()   
         tds[gcsck] = ds
         ds = nil
         sleep(100)
      end
      local str = tostring(tds[gcsck]:Size())   
      PrintDbgStr(str)         
      return 1      
   end         
end
 

Вот функция в библиотеке DLL

Код
bool QSubscribeAllTrades(lua_State *L, const string classcode, const string seccode, unsigned int loadalltradesafternum)
{
   lua_getfield(L, LUA_GLOBALSINDEX, "SubscribeAllTrades");
   lua_pushstring(L, classcode.c_str());
   lua_pushstring(L, seccode.c_str());   
   lua_pushnumber(L, loadalltradesafternum);
   lua_call(L, 3, 1);
   long R = (int)lua_tointeger(L, -1);
   lua_pop(L, 1);      
   return (R == 1);
}
 
Запускаем эту функцию в цикле 100000 раз. Если передаваемый  lua_State *L не из main, то quik падает в неожиданных и разных местах кода. Если в функции не обращаться к полям CreateDataSource, то всё работает нормально и  lua_State *L значения не имеет.
 
QSubscribeAllTrades вызывается в других потоках порождаемых Вашей DLL?
 
Цитата
Michael Bulychev пишет:
QSubscribeAllTrades вызывается в других потоках порождаемых Вашей DLL?
Да, но также тестировал и в main и в OnInit - разницы нет.
 
И. сейчас эта функция вызывается из порождённого потока, если стек передан из main, то всё работает.
Страницы: 1
Читают тему
Наверх