Stats.h 3.2 KB
Newer Older
1
/* -----------------------------------------------------------------------------
2
 *
3
 * (c) The GHC Team, 1998-2005
4 5 6 7 8
 *
 * Statistics and timing-related functions.
 *
 * ---------------------------------------------------------------------------*/

9
#pragma once
10

11
#include "GetTime.h"
12 13
#include "sm/GC.h"
#include "Sparks.h"
14

15
#include "BeginPrivate.h"
16

Ian Lynagh's avatar
Ian Lynagh committed
17 18 19 20 21 22 23 24 25
#if defined(mingw32_HOST_OS)
/* On Win64, if we say "printf" then gcc thinks we are going to use
   MS format specifiers like %I64d rather than %llu */
#define PRINTF gnu_printf
#else
/* However, on OS X, "gnu_printf" isn't recognised */
#define PRINTF printf
#endif

Simon Marlow's avatar
Simon Marlow committed
26 27
struct gc_thread_;

28 29
void      stat_startInit(void);
void      stat_endInit(void);
30

31
void      stat_startGCSync(struct gc_thread_ *_gct);
32
void      stat_startGC(Capability *cap, struct gc_thread_ *_gct);
33 34
void      stat_endGC  (Capability *cap, struct gc_thread_ *_gct, W_ live,
                       W_ copied, W_ slop, uint32_t gen, uint32_t n_gc_threads,
35 36 37 38
                       W_ par_max_copied, W_ par_balanced_copied,
                       W_ gc_spin_spin, W_ gc_spin_yield, W_ mut_spin_spin,
                       W_ mut_spin_yield, W_ any_work, W_ no_work,
                       W_ scav_find_work);
Simon Marlow's avatar
Simon Marlow committed
39

Ben Gamari's avatar
Ben Gamari committed
40
#if defined(PROFILING)
41
void      stat_startRP(void);
42
void      stat_endRP(uint32_t,
Ben Gamari's avatar
Ben Gamari committed
43
#if defined(DEBUG_RETAINER)
44
                            uint32_t, int,
45
#endif
46
                            double);
47
#endif /* PROFILING */
48

49
#if defined(PROFILING) || defined(DEBUG)
50 51
void      stat_startHeapCensus(void);
void      stat_endHeapCensus(void);
52 53
#endif

54 55
void      stat_startExit(void);
void      stat_endExit(void);
56

57
void      stat_exit(void);
58
void      stat_workerStop(void);
59

60 61
void      initStats0(void);
void      initStats1(void);
62
void      resetChildProcessStats(void);
63

Simon Marlow's avatar
Simon Marlow committed
64
double    mut_user_time_until(Time t);
65
double    mut_user_time(void);
66

67
void      statDescribeGens( void );
sof's avatar
sof committed
68

Ben Gamari's avatar
Ben Gamari committed
69 70
Time      stat_getElapsedGCTime(void);
Time      stat_getElapsedTime(void);
mrchebas@gmail.com's avatar
mrchebas@gmail.com committed
71

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
typedef struct GenerationSummaryStats_ {
    uint32_t collections;
    uint32_t par_collections;
    Time cpu_ns;
    Time elapsed_ns;
    Time max_pause_ns;
    Time avg_pause_ns;
#if defined(THREADED_RTS) && defined(PROF_SPIN)
    uint64_t sync_spin;
    uint64_t sync_yield;
#endif
} GenerationSummaryStats;

typedef struct RTSSummaryStats_ {
    // These profiling times could potentially be in RTSStats. However, I'm not
    // confident enough to do this now, since there is some logic depending on
    // global state that I do not understand. (Or if I do understand it, it's
    // wrong)
    Time rp_cpu_ns;
    Time rp_elapsed_ns;
    Time hc_cpu_ns;
    Time hc_elapsed_ns;

    Time exit_cpu_ns;
    Time exit_elapsed_ns;

#if defined(THREADED_RTS)
    uint32_t bound_task_count;
    uint64_t sparks_count;
    SparkCounters sparks;
    double work_balance;
#else // THREADED_RTS
    double gc_cpu_percent;
    double gc_elapsed_percent;
#endif
    uint64_t fragmentation_bytes;
    uint64_t average_bytes_used; // This is not shown in the '+RTS -s' report
    uint64_t alloc_rate;
    double productivity_cpu_percent;
    double productivity_elapsed_percent;

    // one for each generation, 0 first
    GenerationSummaryStats* gc_summary_stats;
} RTSSummaryStats;

117
#include "EndPrivate.h"