C++, ガベージコレクション、回収 3/3


ガベージコレクションの回収。どの方式でも多分似たようなものだと思う。


// ガベージコレクショの回収
void GCCollect()
{
std::vector handles;

// 自プロセスの他スレッドを一時停止
MySuspendThread(handles); 

std::vector dels;

// mark 生きているGCObjectとその内部のGCMHeaderにもマーク

...

// sweep 宙に浮いてるGCMHeaderを集めて削除
for( UINT i = 0; i < dels.size(); i++ )
{
void* p = dels[i]->get();
dels[i]->destroy_( p ); // デストラクタの起動

::free( dels[i] ); // 本当にヒープメモリから削除
}

// 止めたスレッドを再開
MyResumeThread( handles );
}

// 自分以外の同一プロセス内の全スレッドを停止
static void MySuspendThread( std::vector& ar )
{
THREADENTRY32 info;
HANDLE hsnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
info.dwSize = sizeof(info);

BOOL bl = Thread32First( hsnap, &info );
DWORD thid = GetCurrentThreadId();
DWORD processid = ::GetCurrentProcessId();

while( bl )
{
HANDLE th = OpenThread(THREAD_SUSPEND_RESUME, false, info.th32ThreadID );

if ( info.th32OwnerProcessID == processid && thid != info.th32ThreadID )
{
::SuspendThread( th );
ar.push_back( th );
}

bl = Thread32Next( hsnap, &info );
}
CloseHandle( hsnap );
}

// スレッド再開
static void MyResumeThread(std::vector& ar )
{
auto it = ar.begin();
while( it != ar.end())
{
::ResumeThread( *it++ );
}
}