rts: Add --internal-counters RTS flag and several counters
[ghc.git] / rts / sm / GC.h
index 913df24..7fce87e 100644 (file)
@@ -6,42 +6,60 @@
  *
  * Documentation on the architecture of the Garbage Collector can be
  * found in the online commentary:
- * 
- *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC
+ *
+ *   http://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC
  *
  * ---------------------------------------------------------------------------*/
 
-#ifndef GC_H
-#define GC_H
+#pragma once
 
-extern nat N;
-extern rtsBool major_gc;
+#include "BeginPrivate.h"
 
-extern bdescr *mark_stack_bdescr;
-extern StgPtr *mark_stack;
-extern StgPtr *mark_sp;
-extern StgPtr *mark_splim;
+#include "HeapAlloc.h"
 
-extern rtsBool mark_stack_overflowed;
-extern bdescr *oldgen_scan_bd;
-extern StgPtr  oldgen_scan;
+void GarbageCollect (uint32_t force_major_gc,
+                     bool do_heap_census,
+                     uint32_t gc_type, Capability *cap, bool idle_cap[]);
 
-extern long copied;
+typedef void (*evac_fn)(void *user, StgClosure **root);
 
-#ifdef DEBUG
-extern nat mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS;
-#endif
+StgClosure * isAlive      ( StgClosure *p );
+void         markCAFs     ( evac_fn evac, void *user );
+
+extern uint32_t N;
+extern bool major_gc;
+
+extern bdescr *mark_stack_bd;
+extern bdescr *mark_stack_top_bd;
+extern StgPtr mark_sp;
 
-extern void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta);
+extern bool work_stealing;
 
-#ifdef THREADED_RTS
-extern SpinLock gc_alloc_block_sync;
+#if defined(DEBUG)
+extern uint32_t mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS,
+    mutlist_TVAR,
+    mutlist_TVAR_WATCH_QUEUE,
+    mutlist_TREC_CHUNK,
+    mutlist_TREC_HEADER,
+    mutlist_ATOMIC_INVARIANT,
+    mutlist_INVARIANT_CHECK_QUEUE;
 #endif
 
 #if defined(PROF_SPIN) && defined(THREADED_RTS)
-StgWord64 whitehole_spin;
+extern volatile StgWord64 whitehole_gc_spin;
+extern volatile StgWord64 waitForGcThreads_spin;
+extern volatile StgWord64 waitForGcThreads_yield;
+#endif
+
+void gcWorkerThread (Capability *cap);
+void initGcThreads (uint32_t from, uint32_t to);
+void freeGcThreads (void);
+
+#if defined(THREADED_RTS)
+void waitForGcThreads (Capability *cap, bool idle_cap[]);
+void releaseGCThreads (Capability *cap, bool idle_cap[]);
 #endif
 
 #define WORK_UNIT_WORDS 128
 
-#endif /* GC_H */
+#include "EndPrivate.h"