X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGC.h;h=5a9cb98c48bf624fd98081bde961180d3fe527be;hb=27a28cf6bc2196ee1690ac1fcc4d4c59d9b0d50f;hp=03f527d0a54c3d07249bc1410131a2367065abc5;hpb=5af1615ff84f5ef7c0db4eff486ed55ee3e4c1c5;p=ghc-hetmet.git diff --git a/rts/sm/GC.h b/rts/sm/GC.h index 03f527d..5a9cb98 100644 --- a/rts/sm/GC.h +++ b/rts/sm/GC.h @@ -73,12 +73,11 @@ ------------------------------------------------------------------------- */ typedef struct step_workspace_ { - step * stp; // the step for this workspace + step * step; // the step for this workspace struct gc_thread_ * gct; // the gc_thread that contains this workspace // block that is currently being scanned bdescr * scan_bd; - StgPtr scan; // the scan pointer // where objects to be scavenged go bdescr * todo_bd; @@ -91,9 +90,13 @@ typedef struct step_workspace_ { // where large objects to be scavenged go bdescr * todo_large_objects; - // Objects that need not be, or have already been, scavenged. + // Objects that have already been, scavenged. bdescr * scavd_list; - lnat n_scavd_blocks; // count of blocks in this list + nat n_scavd_blocks; // count of blocks in this list + + // Partially-full, scavenged, blocks + bdescr * part_list; + unsigned int n_part_blocks; // count of above } step_workspace; @@ -116,12 +119,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 // -------------------- @@ -136,7 +140,7 @@ typedef struct gc_thread_ { // variable). rtsBool failed_to_evac; // failure to evacuate an object typically - // causes it to be recorded in the mutable + // Causes it to be recorded in the mutable // object list rtsBool eager_promotion; // forces promotion to the evac gen @@ -148,19 +152,34 @@ typedef struct gc_thread_ { #ifdef USE_PAPI int papi_events; #endif - + + // ------------------- + // stats + + lnat copied; + lnat any_work; + lnat no_work; + lnat scav_find_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 nat n_gc_threads; -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; @@ -172,14 +191,12 @@ extern StgPtr oldgen_scan; extern long copied; -#ifdef THREADED_RTS -extern SpinLock static_objects_sync; -#endif - #ifdef DEBUG extern nat mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS; #endif StgClosure * isAlive(StgClosure *p); +#define WORK_UNIT_WORDS 128 + #endif /* GC_H */