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