andromedarabbit / earlgrey

High performance online gaming server engine.
2 stars 1 forks source link

메모리 관리자의 수명에 따른 근본적인 문제점. #52

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
EARLGREY_BUILD_MODE_HIGH_PERFORMANCE 를 정의(define)하면 
ThreadLocalAllocator를 stl 컨테이너에 사용하게 됩니다. 이때 
Earlgrey.Test를 
몇번 실행해보면 Loki::Singleton 쪽에서 예외가 발생합니다. 

가만히 분석해보면 주로 프로그램 종료시 
GlobalExceptionHandler의 static 멤버
를 CRT(스펠링 맞나?) 제거(소멸)시킬 때 충돌이 발생합니다.

이유라면.....

1. IO 스레드가 종료될 때 Loki::Singleton인 
gMemoryAllocator(ThreadLocalAllocator를 쓰는)가 삭제됩니다.

2. CRT가 주 스레드를 종료시킬 때 GlobalExceptionHandler의 멤버도 
제거하려 
합니다. 이때 이 멤버 중 일부가 ThreadLocalAllocator::delete 를 
호출해 메모
리를 소멸하려 합니다. 1번 과정에서 ThreadLocalAllocator의 
인스턴스는 사라졌
기 때문에 Dead reference 예외가 발생합니다.

자, 이 문제를 근본적으로 해결할 방법이 있을까요? 해결이 
쉽지 않아 보이는데 
말이죠.

Original issue reported on code.google.com by kaistizen on 10 Feb 2010 at 11:31

GoogleCodeExporter commented 9 years ago
issue 47 에서 보고한 문제의 원인이 바로 이겁니다. 똑같은 
문제이므로 issue 47 은 닫겠습
니다.

Original comment by kaistizen on 10 Feb 2010 at 11:32

GoogleCodeExporter commented 9 years ago
Issue 47 has been merged into this issue.

Original comment by kaistizen on 10 Feb 2010 at 11:33

GoogleCodeExporter commented 9 years ago
호출스택 예

Earlgrey.Test.exe!Loki::SingletonHolder<Earlgrey::TimerManager,Loki::Create
UsingNew,Loki::DefaultLifetime,Loki::SingleThreaded,Earlgrey::NoLock>::Dest
roySingleton()  줄 840 + 0x22 바이트    C++
    msvcr90d.dll!doexit(int code=1, int quick=0, int retcaller=0)  줄 
591 C
    msvcr90d.dll!exit(int code=1)  줄 412 + 0xd 바이트  C
    Earlgrey.Test.exe!__tmainCRTStartup()  줄 599  C
    Earlgrey.Test.exe!wmainCRTStartup()  줄 403    C
    kernel32.dll!76963677()     
    [아래 프레임은 올바르지 않거나 누락되었거나 kernel32.dll에 대해 로
드된 기호가 없음]    
    ntdll.dll!77349d72()    
    ntdll.dll!77349d45()    

Original comment by kaistizen on 10 Feb 2010 at 11:34

GoogleCodeExporter commented 9 years ago
Issue 38 has been merged into this issue.

Original comment by kaistizen on 10 Feb 2010 at 11:42

GoogleCodeExporter commented 9 years ago
전에는 memory allocator 는 #pragma init_seg(compiler) 로 올려서 
construction priority 
를 높여서 해결했죠.. 이거 말고 다른 방식은 sigleton 을 생성 
순서를 제어하는 방법이 있는
데..pragma 로 해결해보고 다른 방법을 찾아보죠. 

Original comment by joe.j...@gmail.com on 11 Feb 2010 at 12:45