implemented wxExecute() for wxDFB; share the implementation with wxX11

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50834 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2007-12-19 18:52:55 +00:00
parent 93254327a1
commit 46c7e1a120
6 changed files with 102 additions and 69 deletions

View File

@@ -89,59 +89,6 @@ bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd))
return false;
}
// ----------------------------------------------------------------------------
// wxExecute stuff
// ----------------------------------------------------------------------------
WX_DECLARE_HASH_MAP( int, wxEndProcessData*, wxIntegerHash, wxIntegerEqual, wxProcMap );
static wxProcMap *gs_procmap;
int wxAddProcessCallback(wxEndProcessData *proc_data, int fd)
{
if (!gs_procmap) gs_procmap = new wxProcMap();
(*gs_procmap)[fd] = proc_data;
return 1;
}
void wxCheckForFinishedChildren()
{
wxProcMap::iterator it;
if (!gs_procmap) return;
if (gs_procmap->size() == 0) {
// Map empty, delete it.
delete gs_procmap;
gs_procmap = NULL;
return;
}
for (it = gs_procmap->begin();it != gs_procmap->end(); ++it)
{
wxEndProcessData *proc_data = it->second;
int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
int status = 0;
// has the process really terminated?
int rc = waitpid(pid, &status, WNOHANG);
if (rc == 0)
continue; // no, it didn't exit yet, continue waiting
// set exit code to -1 if something bad happened
proc_data->exitcode = rc != -1 && WIFEXITED(status) ?
WEXITSTATUS(status) : -1;
// child exited, end waiting
close(it->first);
// don't call us again!
gs_procmap->erase(it->first);
wxHandleProcessTermination(proc_data);
// Iterator is invalid. Handle any further children in subsequent
// calls.
break;
}
}
// ----------------------------------------------------------------------------
// misc
// ----------------------------------------------------------------------------