bool ValgrindMemcheckProcessor::Process(const wxString & outputLogFileName) { //CL_DEBUG1(PLUGIN_PREFIX("ValgrindMemcheckProcessor::Process()")); if (!outputLogFileName.IsEmpty()) m_outputLogFileName = outputLogFileName; CL_DEBUG(PLUGIN_PREFIX("Processing file '%s'", m_outputLogFileName)); wxXmlDocument doc; if (!doc.Load(m_outputLogFileName) || doc.GetRoot()->GetName() != wxT("valgrindoutput")) { CL_WARNING("Error while loading file '%s'", m_outputLogFileName); return false; } m_errorList.clear(); int i = 0; wxXmlNode *errorNode = doc.GetRoot()->GetChildren(); while (errorNode) { if (errorNode->GetName() == wxT("error")) { m_errorList.push_back(ProcessError(doc, errorNode)); } errorNode = errorNode->GetNext(); if (i < 1000) i++; else { i = 0; //ATTN m_mgr->GetTheApp() wxTheApp->Yield(); } } return true; }
wxString ValgrindMemcheckProcessor::GetExecutionCommand(const wxString & originalCommand) { //CL_DEBUG1(PLUGIN_PREFIX("ValgrindMemcheckProcessor::GetExecutionCommand()")); m_outputLogFileName = m_settings->GetValgrindSettings().GetOutputFile(); if (m_settings->GetValgrindSettings().GetOutputInPrivateFolder() && m_outputLogFileName.IsEmpty()) CL_ERROR(PLUGIN_PREFIX("Valgrind output file is not set properly. Using default - file in private folder")); if (m_settings->GetValgrindSettings().GetOutputInPrivateFolder() || m_outputLogFileName.IsEmpty()) { if (WorkspaceST::Get()->IsOpen()) m_outputLogFileName = wxFileName(WorkspaceST::Get()->GetPrivateFolder(), "valgrind.memcheck.log.xml").GetFullPath(); else m_outputLogFileName = wxFileName(wxStandardPaths::Get().GetTempDir(), "valgrind.memcheck.log.xml").GetFullPath(); } wxArrayString suppFiles = GetSuppressionFiles(); wxString suppresions; for (wxArrayString::iterator it = suppFiles.begin(); it != suppFiles.end(); ++it) suppresions.Append(wxString::Format(" %s='%s'", m_settings->GetValgrindSettings().GetSuppressionFileOption(), *it)); return wxString::Format("%s %s %s %s %s %s", m_settings->GetValgrindSettings().GetBinary(), m_settings->GetValgrindSettings().GetMandatoryOptions(), wxString::Format("%s='%s'", m_settings->GetValgrindSettings().GetOutputFileOption(), m_outputLogFileName), suppresions, m_settings->GetValgrindSettings().GetOptions(), originalCommand); }
unsigned int MemCheckOutputView::GetColumnByName(const wxString& name) { for(unsigned int i = 0; i < m_dataViewCtrlErrors->GetColumnCount(); i++) if(m_dataViewCtrlErrors->GetColumn(i)->GetTitle().IsSameAs(name, false)) return i; CL_ERROR(PLUGIN_PREFIX("Column named '%s' not found.", name)); return -1; }
void MemCheckOutputView::ShowPageView(size_t page) { // CL_DEBUG1(PLUGIN_PREFIX("MemCheckOutputView::ShowPage()")); if(page < 1) m_currentPage = 1; else if(page > m_pageMax) m_currentPage = m_pageMax; else m_currentPage = page; if(m_currentPage == 0) m_textCtrlPageNumber->Clear(); else pageValidator.TransferToWindow(); // it sets m_textCtrlPageNumber m_currentPageIsEmptyView = true; m_currentItem = wxDataViewItem(0); m_onValueChangedLocked = false; m_markedErrorsCount = 0; m_dataViewCtrlErrorsModel->Clear(); if(m_totalErrorsView == 0) return; ErrorList& errorList = m_plugin->GetProcessor()->GetErrors(); long iStart = (long)(m_currentPage - 1) * m_plugin->GetSettings()->GetResultPageSize(); long iStop = (long)std::min(m_totalErrorsView - 1, m_currentPage * m_plugin->GetSettings()->GetResultPageSize() - 1); // CL_DEBUG1(PLUGIN_PREFIX("start - stop = %lu - %lu", iStart, iStop)); m_currentPageIsEmptyView = (iStop - iStart) < 0; // this should never happen if m_totalErrorsView > 0, but... if(m_currentPageIsEmptyView) return; wxWindowDisabler disableAll; wxBusyInfo wait(wxT(BUSY_MESSAGE)); m_mgr->GetTheApp()->Yield(); unsigned int flags = 0; if(m_plugin->GetSettings()->GetOmitNonWorkspace()) flags |= MC_IT_OMIT_NONWORKSPACE; if(m_plugin->GetSettings()->GetOmitDuplications()) flags |= MC_IT_OMIT_DUPLICATIONS; if(m_plugin->GetSettings()->GetOmitSuppressed()) flags |= MC_IT_OMIT_SUPPRESSED; size_t i = 0; MemCheckIterTools::ErrorListIterator it = MemCheckIterTools::Factory(errorList, m_workspacePath, flags); for(; i < iStart && it != errorList.end(); ++i, ++it) ; // skipping item before start // CL_DEBUG1(PLUGIN_PREFIX("items skiped")); m_mgr->GetTheApp()->Yield(); for(; i <= iStop; ++i, ++it) { if(it == errorList.end()) { CL_WARNING(PLUGIN_PREFIX("Some items skiped. Total errors count mismatches the iterator.")); break; } AddTree(wxDataViewItem(0), *it); // CL_DEBUG1(PLUGIN_PREFIX("adding %lu", i)); if(!(i % WAIT_UPDATE_PER_ITEMS)) m_mgr->GetTheApp()->Yield(); } }
wxDataViewItem MemCheckOutputView::GetTopParent(wxDataViewItem item) { // CL_DEBUG1(PLUGIN_PREFIX("MemCheckOutputView::GetTopParent()")); wxVector<wxVariant> cols; wxDataViewIconText x; if(!item.IsOk()) { CL_ERROR(PLUGIN_PREFIX("Virtual root item has no parent.")); return item; } wxDataViewItem parent = m_dataViewCtrlErrorsModel->GetParent(item); while(parent.IsOk()) { item = parent; parent = m_dataViewCtrlErrorsModel->GetParent(item); } return item; }
void MemCheckOutputView::LoadErrors() { CL_DEBUG1(PLUGIN_PREFIX("MemCheckOutputView::LoadErrors()")); if(m_mgr->IsWorkspaceOpen()) m_workspacePath = m_mgr->GetWorkspace()->GetWorkspaceFileName().GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR); else m_workspacePath = wxEmptyString; // common part for both pages m_choiceSuppFile->Set(m_plugin->GetProcessor()->GetSuppressionFiles()); m_choiceSuppFile->SetSelection(0); // errors panel ResetItemsView(); ShowPageView(1); // after reload start at page 1 // supp panel ResetItemsSupp(); ApplyFilterSupp(FILTER_CLEAR); }
void MemCheckOutputView::ApplyFilterSupp(unsigned int mode) { // CL_DEBUG1(PLUGIN_PREFIX("MemCheckOutputView::ApplyFilterSupp()")); ErrorList& errorList = m_plugin->GetProcessor()->GetErrors(); // change filter type if(mode == FILTER_STRING && m_searchCtrlFilter->GetValue().IsSameAs(wxT(FILTER_NONWORKSPACE_PLACEHOLDER))) mode = FILTER_WORKSPACE; if(mode == FILTER_STRING && m_searchCtrlFilter->GetValue().IsEmpty()) mode = FILTER_CLEAR; size_t iterFlags = 0; if(m_plugin->GetSettings()->GetOmitSuppressed()) iterFlags |= MC_IT_OMIT_SUPPRESSED; m_filterResults.clear(); m_listCtrlErrors->SetItemCount(0); switch(mode) { case FILTER_CLEAR: m_searchCtrlFilter->Clear(); for(MemCheckIterTools::ErrorListIterator it = MemCheckIterTools::Factory(errorList, wxEmptyString, iterFlags); it != errorList.end(); ++it) m_filterResults.push_back(&*it); m_totalErrorsSupp = m_filterResults.size(); m_checkBoxInvert->SetValue(false); m_checkBoxCase->SetValue(false); m_checkBoxRegexp->SetValue(false); m_checkBoxWord->SetValue(false); break; case FILTER_WORKSPACE: CL_DEBUG1(PLUGIN_PREFIX("m_workspacePath %s", m_workspacePath)); m_searchCtrlFilter->SetValue(wxT(FILTER_NONWORKSPACE_PLACEHOLDER)); m_searchCtrlFilter->SelectAll(); for(MemCheckIterTools::ErrorListIterator it = MemCheckIterTools::Factory(errorList, wxEmptyString, iterFlags); it != errorList.end(); ++it) { if(m_checkBoxInvert->IsChecked() == (*it).hasPath(m_workspacePath)) m_filterResults.push_back(&*it); } break; case FILTER_STRING: size_t flags = 0; if(m_checkBoxCase->IsChecked()) flags |= wxSD_MATCHCASE; if(m_checkBoxRegexp->IsChecked()) flags |= wxSD_REGULAREXPRESSION; if(m_checkBoxWord->IsChecked()) flags |= wxSD_MATCHWHOLEWORD; int offset = 0; int pos = 0, len = 0; if(m_totalErrorsSupp > ITEMS_FOR_WAIT_DIALOG) { wxWindowDisabler disableAll; wxBusyInfo wait(wxT(BUSY_MESSAGE)); m_mgr->GetTheApp()->Yield(); } size_t i = 0; for(MemCheckIterTools::ErrorListIterator it = MemCheckIterTools::Factory(errorList, wxEmptyString, iterFlags); it != errorList.end(); ++it) { if(m_checkBoxInvert->IsChecked() != StringFindReplacer::Search((*it).toString().wc_str(), offset, m_searchCtrlFilter->GetValue().wc_str(), flags, pos, len)) m_filterResults.push_back(&*it); if(m_totalErrorsSupp > ITEMS_FOR_WAIT_DIALOG) { ++i; if(!(i % WAIT_UPDATE_PER_ITEMS)) m_mgr->GetTheApp()->Yield(); } } break; } m_listCtrlErrors->SetItemCount(m_filterResults.size()); UpdateStatusSupp(); itemsInvalidSupp = false; // If tooltip is shown, LEAVE event isnt raised. This should help in most cases, because if filter is reset, this // means mouse leaved list. // m_lastToolTipItem = wxNOT_FOUND; }