void PelotonInit::Initialize() { CONNECTION_THREAD_COUNT = settings::SettingsManager::GetInt( settings::SettingId::connection_thread_count); LOGGING_THREAD_COUNT = 1; GC_THREAD_COUNT = 1; EPOCH_THREAD_COUNT = 1; // set max thread number. thread_pool.Initialize(0, CONNECTION_THREAD_COUNT + 3); // start worker pool threadpool::MonoQueuePool::GetInstance().Startup(); // start indextuner thread pool if (settings::SettingsManager::GetBool(settings::SettingId::brain)) { threadpool::MonoQueuePool::GetBrainInstance().Startup(); } int parallelism = (CONNECTION_THREAD_COUNT + 3) / 4; storage::DataTable::SetActiveTileGroupCount(parallelism); storage::DataTable::SetActiveIndirectionArrayCount(parallelism); // start epoch. concurrency::EpochManagerFactory::GetInstance().StartEpoch(); // start GC. gc::GCManagerFactory::GetInstance().StartGC(); // start index tuner if (settings::SettingsManager::GetBool(settings::SettingId::index_tuner)) { // Set the default visibility flag for all indexes to false index::IndexMetadata::SetDefaultVisibleFlag(false); auto &index_tuner = tuning::IndexTuner::GetInstance(); index_tuner.Start(); } // start layout tuner if (settings::SettingsManager::GetBool(settings::SettingId::layout_tuner)) { auto &layout_tuner = tuning::LayoutTuner::GetInstance(); layout_tuner.Start(); } // Initialize catalog auto pg_catalog = catalog::Catalog::GetInstance(); pg_catalog->Bootstrap(); // Additional catalogs settings::SettingsManager::GetInstance().InitializeCatalog(); // begin a transaction auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); // initialize the catalog and add the default database, so we don't do this on // the first query pg_catalog->CreateDatabase(DEFAULT_DB_NAME, txn); txn_manager.CommitTransaction(txn); // Initialize the Statement Cache Manager StatementCacheManager::Init(); }
// Load with multithreaded void Level::LoadMultiple() { ThreadPool * pool = new ThreadPool(); pool->Initialize(prefs.threads, ThreadPoolWork); stack<ThreadString *> strings; // Preparing region object RegionReader region = RegionReader(); int current = 0; bool useRegion = (prefs.version == BETA); int n = 0; // Start swimming while ( (!files.empty() || pool->Progress()) && !cancel) { // Get latest result if (!pool->EmptyResult()) { ThreadChunk * chnk = (ThreadChunk *)pool->PopResult(); if (chnk != 0) { ++result; } else { --total; } } // Push work if (useRegion) { if (current < region.GetAmountChunks() && !pool->FullWork()) { UINT size = 0; BYTE * data = region.GetChunk(current++, size); ThreadString * str = new ThreadString(); str->file.assign(data, data+size); str->prefs = prefs; chunks.push_back(str->chunk = new Chunk()); pool->PushWork(str); strings.push(str); ++n; } if (files.empty() && region.GetAmountChunks() == current) useRegion = false; else if (!files.empty() && current >= region.GetAmountChunks()) { region.Load(files.top()); files.pop(); current = 0; // Reduce amount total -= 1024 - region.GetAmountChunks(); } } else if (!files.empty()) { if (!pool->FullWork()) { ThreadString * str = new ThreadString(); str->file = files.top(); str->prefs = prefs; chunks.push_back(str->chunk = new Chunk()); if (pool->PushWork(str)) { files.pop(); strings.push(str); ++n; } // Evade memory spikes else { delete str->chunk; delete str; } } } // No more work else if (pool->NoMoreWork()) { // Wait for pool to close if (pool->Kill()) break; else continue; } work = (total - files.size()) - result; done = ((float)result/(float)total); Port::Rest(0); } int amount = pool->GetClosedThreads(); if (cancel) while (!pool->Kill()); #ifdef WIN32 if (pool->GetClosedThreads() < prefs.threads) MessageBoxA(0, "Some threads were not released.", "PixelMap", MB_OK); #endif // Clean up after you while (!strings.empty()) { ThreadString * t = strings.top(); strings.pop(); if (t) delete t; } pool->Shutdown(); delete pool; }