C++, ガベージコレクション、回収 3/3
ガベージコレクションの回収。どの方式でも多分似たようなものだと思う。
// ガベージコレクショの回収
void GCCollect()
{
std::vectorhandles;
// 自プロセスの他スレッドを一時停止
MySuspendThread(handles);
std::vectordels;
// 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++ );
}
}