X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGC.h;h=01c6024266c195bd6e2142c95f0fb04fe3bd141d;hb=4c394999264d602f10e7623cefa7588423c4f68b;hp=488a2db8cf506c0ef702f8d93e4b269f807217a8;hpb=cacd714cd545bc3bd07882904055cfee162bd7de;p=ghc-hetmet.git diff --git a/rts/sm/GC.h b/rts/sm/GC.h index 488a2db..01c6024 100644 --- a/rts/sm/GC.h +++ b/rts/sm/GC.h @@ -82,6 +82,9 @@ typedef struct step_workspace_ { // where objects to be scavenged go bdescr * todo_bd; + StgPtr todo_free; // free ptr for todo_bd + StgPtr todo_lim; // lim for todo_bd + bdescr * buffer_todo_bd; // buffer to reduce contention // on the step's todos list @@ -113,12 +116,13 @@ typedef struct gc_thread_ { #endif nat thread_index; // a zero based index identifying the thread - step_workspace ** steps; // 2-d array (gen,step) of workspaces - bdescr * free_blocks; // a buffer of free blocks for this thread // during GC without accessing the block // allocators spin lock. + StgClosure* static_objects; // live static objects + StgClosure* scavenged_static_objects; // static objects scavenged so far + lnat gc_count; // number of gc's this thread has done // -------------------- @@ -132,9 +136,9 @@ typedef struct gc_thread_ { // optimise it into a per-thread // variable). - rtsBool failed_to_evac; // failue to evacuate an object typically - // causes it to be recorded in the mutable - // object list + rtsBool failed_to_evac; // failure to evacuate an object typically + // causes it to be recorded in the mutable + // object list rtsBool eager_promotion; // forces promotion to the evac gen // instead of the to-space @@ -142,18 +146,37 @@ typedef struct gc_thread_ { lnat thunk_selector_depth; // ummm.... not used as of now +#ifdef USE_PAPI + int papi_events; +#endif + + // ------------------- + // stats + + lnat copied; + lnat any_work; + lnat no_work; + lnat scav_global_work; + lnat scav_local_work; + + // ------------------- + // workspaces + + // array of workspaces, indexed by stp->abs_no. This is placed + // directly at the end of the gc_thread structure so that we can get from + // the gc_thread pointer to a workspace using only pointer + // arithmetic, no memory access. This happens in the inner loop + // of the GC, see Evac.c:alloc_for_copy(). + step_workspace steps[]; } gc_thread; extern nat N; extern rtsBool major_gc; -extern gc_thread *gc_threads; +extern gc_thread **gc_threads; register gc_thread *gct __asm__("%rbx"); // extern gc_thread *gct; // this thread's gct TODO: make thread-local -extern StgClosure* static_objects; -extern StgClosure* scavenged_static_objects; - extern bdescr *mark_stack_bdescr; extern StgPtr *mark_stack; extern StgPtr *mark_sp; @@ -164,11 +187,6 @@ extern bdescr *oldgen_scan_bd; extern StgPtr oldgen_scan; extern long copied; -extern long scavd_copied; - -#ifdef THREADED_RTS -extern SpinLock static_objects_sync; -#endif #ifdef DEBUG extern nat mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS;