under windoze, the
wxProcess::Kill(m_Pid[i], wxSIGTERM);
obviously does nothing and does not return, until the signalled process finishes normally.
Therefore it is necessary under windoze, to send the Buildlog message before wxProcess::Kill() is called.
i did a test with the following patch and it works under windoze ok.
plugins\compilergcc\compilergcc.cpp:2273...
int CompilerGCC::KillProcess()
{
ResetBuildState();
m_RunAfterCompile = false;
if (!IsProcessRunning())
return 0;
wxKillError ret = wxKILL_OK;
m_CommandQueue.Clear();
for (size_t i = 0; i < m_ParallelProcessCount; ++i)
{
if (!m_Processes[i])
continue;
#ifdef __WXMSW__
Manager::Get()->GetMessageManager()->Log(m_PageIndex, _("Aborting process %d ... Be patient!"), i);
#endif // __WXMSW__
// Close input pipe
m_Processes[i]->CloseOutput();
((PipedProcess*) m_Processes[i])->ForfeitStreams();
ret = wxProcess::Kill(m_Pid[i], wxSIGTERM);
#ifndef __WXMSW__
if(ret != wxKILL_OK)
{
// No need to tell the user about the errors - just keep him waiting.
Manager::Get()->GetMessageManager()->Log(m_PageIndex, _("Aborting process %d ..."), i);
}
else switch (ret)
{
// case wxKILL_ACCESS_DENIED: cbMessageBox(_("Access denied")); break;
// case wxKILL_NO_PROCESS: cbMessageBox(_("No process")); break;
// case wxKILL_BAD_SIGNAL: cbMessageBox(_("Bad signal")); break;
// case wxKILL_ERROR: cbMessageBox(_("Unspecified error")); break;
case wxKILL_OK:
default: break;//Manager::Get()->GetMessageManager()->Log(m_PageIndex, _("Process killed..."));
}
#endif // __WXMSW__
}
return ret;
}
how does this work under linux ?
is the linux case necessary or could it be thrown completely ?
and maybe simplified to
int CompilerGCC::KillProcess()
{
ResetBuildState();
m_RunAfterCompile = false;
if (!IsProcessRunning())
return 0;
wxKillError ret = wxKILL_OK;
m_CommandQueue.Clear();
for (size_t i = 0; i < m_ParallelProcessCount; ++i)
{
if (!m_Processes[i])
continue;
#ifdef __WXMSW__
Manager::Get()->GetMessageManager()->Log(m_PageIndex, _("Aborting process %d ... Be patient!"), i);
#else
Manager::Get()->GetMessageManager()->Log(m_PageIndex, _("Aborting process %d ..."), i);
#endif // __WXMSW__
// Close input pipe
m_Processes[i]->CloseOutput();
((PipedProcess*) m_Processes[i])->ForfeitStreams();
ret = wxProcess::Kill(m_Pid[i], wxSIGTERM);
}
return ret;
}