implemented notifications of the child process termination (patch 1494439)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39407 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -299,6 +299,7 @@ wxX11:
|
||||
- Invisible text problem fixed.
|
||||
- Bitmap clipping with masks and scaling improved.
|
||||
- Fixed a crash bug in the generic timer.
|
||||
- Implemented child process termination notifications (David Bj<42>rkevik)
|
||||
|
||||
Unix:
|
||||
|
||||
|
@@ -80,5 +80,9 @@ extern Window wxGetWindowParent(Window window);
|
||||
bool wxSetWMDecorations(Window w, long style);
|
||||
bool wxMWMIsRunning(Window w);
|
||||
|
||||
// Checks if any of our children are finished.
|
||||
// implemented in src/x11/utils.cpp
|
||||
void wxCheckForFinishedChildren();
|
||||
|
||||
#endif
|
||||
// _WX_PRIVATE_H_
|
||||
|
@@ -430,6 +430,9 @@ bool wxEventLoop::Dispatch()
|
||||
{
|
||||
XEvent event;
|
||||
|
||||
// Start off by checking if any of our child processes have finished.
|
||||
wxCheckForFinishedChildren();
|
||||
|
||||
// TODO allowing for threads, as per e.g. wxMSW
|
||||
|
||||
// This now waits until either an X event is received,
|
||||
|
@@ -91,10 +91,52 @@ bool wxCheckForInterrupt(wxWindow *wnd)
|
||||
// wxExecute stuff
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
WX_DECLARE_HASH_MAP( int, wxEndProcessData*, wxIntegerHash, wxIntegerEqual, wxProcMap );
|
||||
|
||||
static wxProcMap *gs_procmap;
|
||||
|
||||
int wxAddProcessCallback(wxEndProcessData *proc_data, int fd)
|
||||
{
|
||||
// TODO
|
||||
return 0;
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user