void Parser::OnAllThreadsDone(CodeBlocksEvent& event) { if (m_IgnoreThreadEvents || Manager::IsAppShuttingDown()) return; if (event.GetId() != m_Pool.GetId()) { CCLogger::Get()->DebugLog(_T("Why event.GetId() not equal m_Pool.GetId()?")); return; } if (!m_TokensTree) cbThrow(_T("m_TokensTree is a nullptr?!")); if (!m_IsParsing) { CCLogger::Get()->DebugLog(_T("Why m_IsParsing is false?")); return; } // Do next task if ( !m_PoolTask.empty() || !m_BatchParseFiles.empty() || !m_PriorityHeaders.empty() || !m_PredefinedMacros.IsEmpty() ) { m_BatchTimer.Start(10, wxTIMER_ONE_SHOT); } #if !CC_PARSER_PROFILE_TEST // Reparse system priority headers else if (!m_SystemPriorityHeaders.empty()) { // 1. Remove all priority headers in token tree for (StringList::iterator it = m_SystemPriorityHeaders.begin(); it != m_SystemPriorityHeaders.end(); ++it) RemoveFile(*it); // 2. Reparse system priority headers AddBatchParse(m_SystemPriorityHeaders); // 3. Clear m_SystemPriorityHeaders.clear(); // 4. Begin batch parsing m_BatchTimer.Start(10, wxTIMER_ONE_SHOT); } else if ( (m_ParsingType == ptCreateParser || m_ParsingType == ptAddFileToParser) && m_NeedMarkFileAsLocal && m_Project) { m_NeedMarkFileAsLocal = false; MarkFileAsLocalThread* thread = new MarkFileAsLocalThread(*this, *m_Project); m_Pool.AddTask(thread, true); } #endif // Finish all task, then we need post a PARSER_END event else { if (!m_Project) m_NeedMarkFileAsLocal = false; m_IgnoreThreadEvents = true; m_NeedsReparse = false; m_IsParsing = false; m_IsBatchParseDone = true; EndStopWatch(); wxString parseEndLog; { TRACK_THREAD_LOCKER(s_TokensTreeCritical); wxCriticalSectionLocker locker(s_TokensTreeCritical); THREAD_LOCKER_SUCCESS(s_TokensTreeCritical); parseEndLog.Printf(_T("Project '%s' parsing stage done (%d total parsed files, ") _T("%d tokens in %ld minute(s), %ld.%03ld seconds)."), m_Project ? m_Project->GetTitle().wx_str() : _T("*NONE*"), m_TokensTree ? m_TokensTree->m_FilesMap.size() : 0, m_TokensTree ? m_TokensTree->realsize() : 0, (m_LastStopWatchTime / 60000), (m_LastStopWatchTime / 1000) % 60, (m_LastStopWatchTime % 1000) ); } ProcessParserEvent(m_ParsingType, idParserEnd, parseEndLog); m_ParsingType = ptUndefined; s_CurrentParser = nullptr; } }