int ParserThreadedTask::Execute() { TRACE(_T("ParserThreadedTask::Execute(): Enter")); if (!m_Parser) return 0; CC_LOCKER_TRACK_P_MTX_LOCK(m_ParserMutex) wxString preDefs(m_Parser->m_PredefinedMacros); StringList batchFiles(m_Parser->m_BatchParseFiles); CC_LOCKER_TRACK_P_MTX_UNLOCK(m_ParserMutex); TRACE(_T("ParserThreadedTask::Execute(): Parse predefined macros(in buffer)")); if (!preDefs.IsEmpty()) m_Parser->ParseBuffer(preDefs, false, false); CC_LOCKER_TRACK_P_MTX_LOCK(m_ParserMutex) m_Parser->m_PredefinedMacros.Clear(); CC_LOCKER_TRACK_P_MTX_UNLOCK(m_ParserMutex); if (m_Parser->m_IgnoreThreadEvents) m_Parser->m_IsFirstBatch = true; TRACE(_T("ParserThreadedTask::Execute(): Parse source files")); while (!batchFiles.empty()) { TRACE(_T("-ParserThreadedTask::Execute(): Parse %s"), batchFiles.front().wx_str()); m_Parser->Parse(batchFiles.front()); batchFiles.pop_front(); } CC_LOCKER_TRACK_P_MTX_LOCK(m_ParserMutex) m_Parser->m_BatchParseFiles.clear(); if (m_Parser->m_IgnoreThreadEvents) { m_Parser->m_IgnoreThreadEvents = false; // we need to hear the pool finish event m_Parser->m_IsParsing = true; } CC_LOCKER_TRACK_P_MTX_UNLOCK(m_ParserMutex); TRACE(_T("ParserThreadedTask::Execute(): Leave")); return 0; }
Parser::~Parser() { CC_LOCKER_TRACK_P_MTX_LOCK(ParserCommon::s_ParserMutex) DisconnectEvents(); TerminateAllThreads(); if (ParserCommon::s_CurrentParser == this) ParserCommon::s_CurrentParser = nullptr; CC_LOCKER_TRACK_P_MTX_UNLOCK(ParserCommon::s_ParserMutex) }