internal bool HandleChildEvent(SingleSteppingEngine engine, Inferior inferior,
ref Inferior.ChildEvent cevent, out bool resume_target)
{
if (cevent.Type == Inferior.ChildEventType.NONE) {
resume_target = true;
return true;
}
if (cevent.Type == Inferior.ChildEventType.CHILD_CREATED_THREAD) {
int pid = (int) cevent.Argument;
inferior.Process.ThreadCreated (inferior, pid, false, true);
if (pending_sigstops.ContainsKey (pid))
pending_sigstops.Remove (pid);
resume_target = true;
return true;
}
if (cevent.Type == Inferior.ChildEventType.CHILD_FORKED) {
inferior.Process.ChildForked (inferior, (int) cevent.Argument);
resume_target = true;
return true;
}
if (cevent.Type == Inferior.ChildEventType.CHILD_EXECD) {
thread_hash.Remove (engine.PID);
engine_hash.Remove (engine.ID);
inferior.Process.ChildExecd (engine, inferior);
resume_target = false;
return true;
}
if (cevent.Type == Inferior.ChildEventType.CHILD_STOPPED) {
if (cevent.Argument == inferior.SIGCHLD) {
cevent = new Inferior.ChildEvent (
Inferior.ChildEventType.CHILD_STOPPED, 0, 0, 0);
resume_target = true;
return true;
} else if (inferior.Has_SIGWINCH && (cevent.Argument == inferior.SIGWINCH)) {
resume_target = true;
return true;
} else if (inferior.HasSignals && (cevent.Argument == inferior.Kernel_SIGRTMIN+1)) {
// __SIGRTMIN and __SIGRTMIN+1 are used internally by the threading library
resume_target = true;
return true;
}
}
if (inferior.Process.OperatingSystem.CheckForPendingMonoInit (inferior)) {
resume_target = true;
return true;
}
bool retval = false;
resume_target = false;
if (inferior.Process.MonoManager != null)
retval = inferior.Process.MonoManager.HandleChildEvent (
engine, inferior, ref cevent, out resume_target);
if ((cevent.Type == Inferior.ChildEventType.CHILD_EXITED) ||
(cevent.Type == Inferior.ChildEventType.CHILD_SIGNALED)) {
thread_hash.Remove (engine.PID);
engine_hash.Remove (engine.ID);
engine.OnThreadExited (cevent);
resume_target = false;
return true;
}
return retval;
}