OnThreadExited() private method

private OnThreadExited ( Inferior cevent ) : void
cevent Inferior
return void
Ejemplo n.º 1
0
        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;
        }