blob: 3f3a0a952f0a4b0bea64a5a8056245d7bdc42ae1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
/* -----------------------------------------------------------------------------
*
* (c) The GHC Team, 1998-1999
*
* Datatypes that holds the command-line flag settings.
*
* ---------------------------------------------------------------------------*/
#ifndef RTS_FLAGS_H
#define RTS_FLAGS_H
#include <stdio.h>
/* For defaults, see the @initRtsFlagsDefaults@ routine. */
struct GC_FLAGS {
FILE *statsFile;
nat giveStats;
#define NO_GC_STATS 0
#define COLLECT_GC_STATS 1
#define ONELINE_GC_STATS 2
#define SUMMARY_GC_STATS 3
#define VERBOSE_GC_STATS 4
nat maxStkSize; /* in *words* */
nat initialStkSize; /* in *words* */
nat maxHeapSize; /* in *blocks* */
nat minAllocAreaSize; /* in *blocks* */
nat minOldGenSize; /* in *blocks* */
nat heapSizeSuggestion; /* in *blocks* */
double oldGenFactor;
double pcFreeHeap;
nat generations;
nat steps;
rtsBool squeezeUpdFrames;
rtsBool compact; /* True <=> "compact all the time" */
double compactThreshold;
rtsBool sweep; /* use "mostly mark-sweep" instead of copying
* for the oldest generation */
rtsBool ringBell;
rtsBool frontpanel;
int idleGCDelayTime; /* in milliseconds */
StgWord heapBase; /* address to ask the OS for memory */
};
struct DEBUG_FLAGS {
/* flags to control debugging output & extra checking in various subsystems */
rtsBool scheduler; /* 's' */
rtsBool interpreter; /* 'i' */
rtsBool weak; /* 'w' */
rtsBool gccafs; /* 'G' */
rtsBool gc; /* 'g' */
rtsBool block_alloc; /* 'b' */
rtsBool sanity; /* 'S' warning: might be expensive! */
rtsBool stable; /* 't' */
rtsBool prof; /* 'p' */
rtsBool eventlog; /* 'e' */
rtsBool linker; /* 'l' the object linker */
rtsBool apply; /* 'a' */
rtsBool stm; /* 'm' */
rtsBool squeeze; /* 'z' stack squeezing & lazy blackholing */
rtsBool hpc; /* 'c' coverage */
rtsBool timestamp; /* add timestamps to traces */
};
struct COST_CENTRE_FLAGS {
unsigned int doCostCentres;
# define COST_CENTRES_SUMMARY 1
# define COST_CENTRES_VERBOSE 2 /* incl. serial time profile */
# define COST_CENTRES_ALL 3
# define COST_CENTRES_XML 4
int profilerTicks; /* derived */
int msecsPerTick; /* derived */
};
struct PROFILING_FLAGS {
unsigned int doHeapProfile;
# define NO_HEAP_PROFILING 0 /* N.B. Used as indexes into arrays */
# define HEAP_BY_CCS 1
# define HEAP_BY_MOD 2
# define HEAP_BY_DESCR 4
# define HEAP_BY_TYPE 5
# define HEAP_BY_RETAINER 6
# define HEAP_BY_LDV 7
# define HEAP_BY_CLOSURE_TYPE 8
nat profileInterval; /* delta between samples (in ms) */
nat profileIntervalTicks; /* delta between samples (in 'ticks') */
rtsBool includeTSOs;
rtsBool showCCSOnException;
nat maxRetainerSetSize;
nat ccsLength;
char* modSelector;
char* descrSelector;
char* typeSelector;
char* ccSelector;
char* ccsSelector;
char* retainerSelector;
char* bioSelector;
};
#ifdef EVENTLOG
struct EVENTLOG_FLAGS {
rtsBool doEventLogging;
};
#endif
struct CONCURRENT_FLAGS {
int ctxtSwitchTime; /* in milliseconds */
int ctxtSwitchTicks; /* derived */
};
struct MISC_FLAGS {
int tickInterval; /* in milliseconds */
rtsBool install_signal_handlers;
rtsBool machineReadable;
StgWord linkerMemBase; /* address to ask the OS for memory
* for the linker, NULL ==> off */
};
#ifdef THREADED_RTS
struct PAR_FLAGS {
nat nNodes; /* number of threads to run simultaneously */
rtsBool migrate; /* migrate threads between capabilities */
rtsBool wakeupMigrate; /* migrate a thread on wakeup */
unsigned int maxLocalSparks;
rtsBool parGcEnabled; /* enable parallel GC */
rtsBool parGcGen; /* do parallel GC in this generation
* and higher only */
rtsBool parGcLoadBalancing; /* do load-balancing in parallel GC */
rtsBool setAffinity; /* force thread affinity with CPUs */
};
#endif /* THREADED_RTS */
struct TICKY_FLAGS {
rtsBool showTickyStats;
FILE *tickyFile;
};
#ifdef USE_PAPI
#define MAX_PAPI_USER_EVENTS 8
struct PAPI_FLAGS {
nat eventType; /* The type of events to count */
nat numUserEvents;
char * userEvents[MAX_PAPI_USER_EVENTS];
};
#define PAPI_FLAG_CACHE_L1 1
#define PAPI_FLAG_CACHE_L2 2
#define PAPI_FLAG_BRANCH 3
#define PAPI_FLAG_STALLS 4
#define PAPI_FLAG_CB_EVENTS 5
#define PAPI_USER_EVENTS 6
#endif
/* Put them together: */
typedef struct _RTS_FLAGS {
/* The first portion of RTS_FLAGS is invariant. */
struct GC_FLAGS GcFlags;
struct CONCURRENT_FLAGS ConcFlags;
struct MISC_FLAGS MiscFlags;
struct DEBUG_FLAGS DebugFlags;
struct COST_CENTRE_FLAGS CcFlags;
struct PROFILING_FLAGS ProfFlags;
#ifdef EVENTLOG
struct EVENTLOG_FLAGS EventLogFlags;
#endif
struct TICKY_FLAGS TickyFlags;
#if defined(THREADED_RTS)
struct PAR_FLAGS ParFlags;
#endif
#ifdef USE_PAPI
struct PAPI_FLAGS PapiFlags;
#endif
} RTS_FLAGS;
#ifdef COMPILING_RTS_MAIN
extern DLLIMPORT RTS_FLAGS RtsFlags;
#elif IN_STG_CODE
/* Hack because the C code generator can't generate '&label'. */
extern RTS_FLAGS RtsFlags[];
#else
extern RTS_FLAGS RtsFlags;
#endif
/* Routines that operate-on/to-do-with RTS flags: */
extern void initRtsFlagsDefaults(void);
extern void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
extern void setProgName(char *argv[]);
/*
* The printf formats are here, so we are less likely to make
* overly-long filenames (with disastrous results). No more than 128
* chars, please!
*/
#define STATS_FILENAME_MAXLEN 128
#define GR_FILENAME_FMT "%0.124s.gr"
#define GR_FILENAME_FMT_GUM "%0.120s.%03d.%s"
#define HP_FILENAME_FMT "%0.124s.hp"
#define LIFE_FILENAME_FMT "%0.122s.life"
#define PROF_FILENAME_FMT "%0.122s.prof"
#define PROF_FILENAME_FMT_GUM "%0.118s.%03d.prof"
#define QP_FILENAME_FMT "%0.124s.qp"
#define STAT_FILENAME_FMT "%0.122s.stat"
#define TICKY_FILENAME_FMT "%0.121s.ticky"
#define TIME_FILENAME_FMT "%0.122s.time"
#define TIME_FILENAME_FMT_GUM "%0.118s.%03d.time"
/* an "int" so as to match normal "argc" */
/* Now defined in Stg.h (lib/std/cbits need these too.)
extern int prog_argc;
extern char **prog_argv;
*/
extern int rts_argc; /* ditto */
extern char *rts_argv[];
#endif /* RTS_FLAGS_H */
|