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; }