Skip to content

Instantly share code, notes, and snippets.

@mrkn
Last active December 14, 2015 13:48

Revisions

  1. mrkn renamed this gist Mar 6, 2013. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. mrkn created this gist Mar 6, 2013.
    114 changes: 114 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,114 @@
    diff --git a/gc.c b/gc.c
    index 0f84e22..b6e2e28 100644
    --- a/gc.c
    +++ b/gc.c
    @@ -393,6 +393,7 @@ typedef struct rb_objspace {
    struct gc_list *global_list;
    size_t count;
    int gc_stress;
    + int gc_disable_lazy_sweep;
    } rb_objspace_t;

    #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
    @@ -419,6 +420,7 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
    #define deferred_final_list objspace->final.deferred
    #define global_List objspace->global_list
    #define ruby_gc_stress objspace->gc_stress
    +#define ruby_gc_disable_lazy_sweep objspace->gc_disable_lazy_sweep
    #define initial_malloc_limit initial_params.initial_malloc_limit
    #define initial_heap_min_slots initial_params.initial_heap_min_slots
    #define initial_free_min initial_params.initial_free_min
    @@ -445,6 +447,7 @@ void
    rb_gc_set_params(void)
    {
    char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr;
    + char *disable_lazy_sweep_ptr;

    if (rb_safe_level() > 0) return;

    @@ -480,6 +483,15 @@ rb_gc_set_params(void)
    initial_free_min = free_min_i;
    }
    }
    +
    + disable_lazy_sweep_ptr = getenv("RUBY_GC_DISABLE_LAZY_SWEEP");
    + if (disable_lazy_sweep_ptr != NULL) {
    + int disable_lazy_sweep_i = atoi(disable_lazy_sweep_ptr);
    + if (RTEST(ruby_verbose))
    + fprintf(stderr, "disable_lazy_sweep=%d (%d)\n",
    + disable_lazy_sweep_i, rb_objspace.gc_disable_lazy_sweep);
    + rb_objspace.gc_disable_lazy_sweep = disable_lazy_sweep_i;
    + }
    }

    #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
    @@ -963,6 +975,51 @@ rb_gc_disable(void)
    return old ? Qtrue : Qfalse;
    }

    +/*
    + * call-seq:
    + * GC.enable_lazy_sweep -> true or false
    + *
    + * Enables lazy sweep algorithm, returning <code>true</code> if lazy
    + * sweep was previously disabled.
    + *
    + * GC.disable_lazy_sweep #=> false
    + * GC.enable_lazy_sweep #=> true
    + * GC.enable_lazy_sweep #=> false
    + *
    + */
    +
    +VALUE
    +rb_gc_enable_lazy_sweep(void)
    +{
    + rb_objspace_t *objspace = &rb_objspace;
    + int old = ruby_gc_disable_lazy_sweep;
    +
    + ruby_gc_disable_lazy_sweep = FALSE;
    + return old ? Qtrue : Qfalse;
    +}
    +
    +/*
    + * call-seq:
    + * GC.disable_lazy_sweep -> true or false
    + *
    + * Disables lazy sweep algorithm, returning <code>true</code> if lazy
    + * sweep was already disabled.
    + *
    + * GC.disable_lazy_sweep #=> false
    + * GC.disable_lazy_sweep #=> true
    + *
    + */
    +
    +VALUE
    +rb_gc_disable_lazy_sweep(void)
    +{
    + rb_objspace_t *objspace = &rb_objspace;
    + int old = ruby_gc_disable_lazy_sweep;
    +
    + ruby_gc_disable_lazy_sweep = TRUE;
    + return old ? Qtrue : Qfalse;
    +}
    +
    VALUE rb_mGC;

    void
    @@ -2273,7 +2330,7 @@ gc_lazy_sweep(rb_objspace_t *objspace)
    int res;
    INIT_GC_PROF_PARAMS;

    - if (objspace->flags.dont_lazy_sweep)
    + if (ruby_gc_disable_lazy_sweep || objspace->flags.dont_lazy_sweep)
    return garbage_collect(objspace);


    @@ -3674,6 +3731,8 @@ Init_GC(void)
    rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
    rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
    rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
    + rb_define_singleton_method(rb_mGC, "enable_lazy_sweep", rb_gc_enable_lazy_sweep, 0);
    + rb_define_singleton_method(rb_mGC, "disable_lazy_sweep", rb_gc_disable_lazy_sweep, 0);
    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
    rb_define_singleton_method(rb_mGC, "count", gc_count, 0);