To nie jest bez kosztu wydajnościowego. Kompilujesz to z __DEBUG_CRITICALSECTION__? Te makro włącza logowanie każdego locka i sam mechanizm logowania nie jest bezpieczny. Dostęp do OTSYS_THREAD_LOCK_CLASS::loglist nie jest synchronizowany.
Ostatnio próbowałem skompilować z -D__DEBUG_CRITICALSECTION__ ale sypneło mi wieloma błędami
In file included from database.h:5,
from actions.cpp:5:
otsystem.h:263:21: error: âlogBlockâ was not declared in this scope
typedef std::list< logBlock > LogList;
^~~~~~~~
otsystem.h:263:21: note: suggested alternative: âsigblockâ
typedef std::list< logBlock > LogList;
^~~~~~~~
sigblock
otsystem.h:263:30: error: template argument 1 is invalid
typedef std::list< logBlock > LogList;
^
otsystem.h:263:30: error: template argument 2 is invalid
otsystem.h: In static member function âstatic void OTSYS_THREAD_LOCK_CLASS::addL og(OTSYS_THREAD_LOCKVAR*, const char*, bool)â:
otsystem.h:242:5: error: âlogBlockâ was not declared in this scope
logBlock lb;
^~~~~~~~
otsystem.h:242:5: note: suggested alternative: âsigblockâ
logBlock lb;
^~~~~~~~
sigblock
otsystem.h:243:3: error: âlbâ was not declared in this scope
lb.mutexaddr = (unsigned long)(a);
^~
otsystem.h:247:17: error: âGetCurrentThreadIdâ was not declared in this scope
lb.threadid = GetCurrentThreadId();
^~~~~~~~~~~~~~~~~~
otsystem.h:247:17: note: suggested alternative: âxmlGetThreadIdâ
lb.threadid = GetCurrentThreadId();
^~~~~~~~~~~~~~~~~~
xmlGetThreadId
otsystem.h:249:36: error: request for member âpush_backâ in âOTSYS_THREAD_LOCK_C LASS::loglistâ, which is of non-class type âOTSYS_THREAD_LOCK_CLASS::LogListâ {a ka âintâ}
OTSYS_THREAD_LOCK_CLASS::loglist.push_back(lb);
^~~~~~~~~
otsystem.h:251:39: error: request for member âsizeâ in âOTSYS_THREAD_LOCK_CLASS: :loglistâ, which is of non-class type âOTSYS_THREAD_LOCK_CLASS::LogListâ {aka âi ntâ}
if(OTSYS_THREAD_LOCK_CLASS::loglist.size() > 1000) {
^~~~
otsystem.h:252:37: error: request for member âpop_frontâ in âOTSYS_THREAD_LOCK_C LASS::loglistâ, which is of non-class type âOTSYS_THREAD_LOCK_CLASS::LogListâ {a ka âintâ}
OTSYS_THREAD_LOCK_CLASS::loglist.pop_front();
^~~~~~~~~
Więc kompiluje bez tego.
na ten moment uruchamiam bez logowania crashy przez gdb tj;
ENDFLAGS=-Werror -O2 -Winvalid-pch -include "preheaders.h"
wtedy gracze nie narzekają, ze ich zacina
a jak pojawiają sie problemy to kompiluje z gdb
ENDFLAGS=-Werror -g -ggdb -Winvalid-pch -include "preheaders.h"
Nie mam w kodzie takich nazw, ale jakby faktycznie tak się mogło zdarzyć, to by znaczyło że jednak znalazłeś jakieś problemy.
Niby tak, ale nie jestem przekonany że to ma jakikolwiek wpływ, ponieważ właściwie na zmianę korzystam z dwóch silników. Innymi słowy - raz uruchamiam jeden serwer gry na jednym silniku, raz na drugim (w którym akurat nie ma tych funkcji). I problem tego typu crashy występował na jednym i drugim.
Edit: jeszcze wyjaśnie - oczywiście "raz uruchamiam jeden serwer gry na jednym silniku, raz na drugim" - miałem na myśli, że np. jeden silnik jest używany przez 3 miesiące, a drugi przez miesiąc, pół roku - różnie. I tak na zmianę.
Nie że jednego dnia ten silnik, a drugiego dnia sobie zmieniam bo to by nie miało sensu.