suspend (Debugger)

    /*
     *   call-seq:
     *      Debugger.suspend -> Debugger
     *
     *   Suspends all contexts.
     */
    static VALUE
    debug_suspend(VALUE self)
    {
        VALUE current, context;
        VALUE saved_crit;
        VALUE context_list;
        debug_context_t *debug_context;
        int i;

        debug_check_started();

        saved_crit = rb_thread_critical;
        rb_thread_critical = Qtrue;
        context_list = debug_contexts(self);
        thread_context_lookup(rb_thread_current(), &current, NULL);

        for(i = 0; i < RARRAY(context_list)->len; i++)
        {
            context = rb_ary_entry(context_list, i);
            if(current == context)
                continue;
            Data_Get_Struct(context, debug_context_t, debug_context);
            context_suspend_0(debug_context);
        }
        rb_thread_critical = saved_crit;

        if(rb_thread_critical == Qfalse)
            rb_thread_schedule();

        return self;
    }