Rts.h 8.92 KB
Newer Older
1
/* -----------------------------------------------------------------------------
2
 *
Simon Marlow's avatar
Simon Marlow committed
3
 * (c) The GHC Team, 1998-2009
4
 *
Simon Marlow's avatar
Simon Marlow committed
5 6
 * RTS external APIs.  This file declares everything that the GHC RTS
 * exposes externally.
7
 *
8 9 10
 * To understand the structure of the RTS headers, see the wiki:
 *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
 *
11 12 13 14 15
 * ---------------------------------------------------------------------------*/

#ifndef RTS_H
#define RTS_H

16 17 18 19
#ifdef __cplusplus
extern "C" {
#endif

20
#ifndef IN_STG_CODE
21
#define IN_STG_CODE 0
22 23 24
#endif
#include "Stg.h"

Simon Marlow's avatar
Simon Marlow committed
25 26
#include "HsFFI.h"
#include "RtsAPI.h"
27

28 29 30 31 32 33
// Turn off inlining when debugging - it obfuscates things
#ifdef DEBUG
# undef  STATIC_INLINE
# define STATIC_INLINE static
#endif

Simon Marlow's avatar
Simon Marlow committed
34
#include "rts/Types.h"
35 36 37 38 39 40 41 42 43 44

#if __GNUC__ >= 3
/* Assume that a flexible array member at the end of a struct
 * can be defined thus: T arr[]; */
#define FLEXIBLE_ARRAY
#else
/* Assume that it must be defined thus: T arr[0]; */
#define FLEXIBLE_ARRAY 0
#endif

45 46 47 48 49 50
#if __GNUC__ >= 3
#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n)))
#else
#define ATTRIBUTE_ALIGNED(n) /*nothing*/
#endif

Simon Marlow's avatar
Simon Marlow committed
51 52 53
// Symbols that are extern, but private to the RTS, are declared
// with visibility "hidden" to hide them outside the RTS shared
// library.
54
#if defined(HAS_VISIBILITY_HIDDEN)
Simon Marlow's avatar
Simon Marlow committed
55
#define RTS_PRIVATE  GNUC3_ATTRIBUTE(visibility("hidden"))
56 57 58 59
#else
#define RTS_PRIVATE  /* disabled: RTS_PRIVATE */
#endif

60
#if __GNUC__ >= 4
61 62 63 64 65
#define RTS_UNLIKELY(p) __builtin_expect((p),0)
#else
#define RTS_UNLIKELY(p) p
#endif

66
/* Fix for mingw stat problem (done here so it's early enough) */
67
#ifdef mingw32_HOST_OS
68 69 70
#define __MSVCRT__ 1
#endif

71 72
/* Needed to get the macro version of errno on some OSs, and also to
   get prototypes for the _r versions of C library functions. */
73
#ifndef _REENTRANT
74
#define _REENTRANT 1
75
#endif
76

77 78 79 80
/*
 * We often want to know the size of something in units of an
 * StgWord... (rounded up, of course!)
 */
81 82 83
#define ROUNDUP_BYTES_TO_WDS(n) (((n) + sizeof(W_) - 1) / sizeof(W_))

#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t))
84 85 86 87

/* -----------------------------------------------------------------------------
   Assertions and Debuggery

88 89 90
   CHECK(p)   evaluates p and terminates with an error if p is false
   ASSERT(p)  like CHECK(p) if DEBUG is on, otherwise a no-op
   -------------------------------------------------------------------------- */
91

Simon Marlow's avatar
Simon Marlow committed
92 93
void _assertFail(const char *filename, unsigned int linenum)
   GNUC3_ATTRIBUTE(__noreturn__);
94

95
#define CHECK(predicate)			\
96 97 98
	if (predicate)				\
	    /*null*/;				\
	else					\
99
	    _assertFail(__FILE__, __LINE__)
100

101 102 103 104 105 106
#define CHECKM(predicate, msg, ...)             \
	if (predicate)				\
	    /*null*/;				\
	else					\
            barf(msg, ##__VA_ARGS__)

107 108
#ifndef DEBUG
#define ASSERT(predicate) /* nothing */
109
#define ASSERTM(predicate,msg,...) /* nothing */
110 111
#else
#define ASSERT(predicate) CHECK(predicate)
112
#define ASSERTM(predicate,msg,...) CHECKM(predicate,msg,##__VA_ARGS__)
113 114 115 116 117 118 119 120 121 122
#endif /* DEBUG */

/* 
 * Use this on the RHS of macros which expand to nothing
 * to make sure that the macro can be used in a context which
 * demands a non-empty statement.
 */

#define doNothing() do { } while (0)

123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
#ifdef DEBUG
#define USED_IF_DEBUG
#define USED_IF_NOT_DEBUG STG_UNUSED
#else
#define USED_IF_DEBUG STG_UNUSED
#define USED_IF_NOT_DEBUG
#endif

#ifdef THREADED_RTS
#define USED_IF_THREADS
#define USED_IF_NOT_THREADS STG_UNUSED
#else
#define USED_IF_THREADS STG_UNUSED
#define USED_IF_NOT_THREADS
#endif

Simon Marlow's avatar
Simon Marlow committed
139 140 141 142 143 144 145
/*
 * Getting printf formats right for platform-dependent typedefs
 */
#if SIZEOF_LONG == 8
#define FMT_Word64 "lu"
#define FMT_Int64  "ld"
#else
146 147 148 149 150 151
#if defined(mingw32_HOST_OS)
/* mingw doesn't understand %llu/%lld - it treats them as 32-bit
   rather than 64-bit */
#define FMT_Word64 "I64u"
#define FMT_Int64  "I64d"
#else
Simon Marlow's avatar
Simon Marlow committed
152 153 154
#define FMT_Word64 "llu"
#define FMT_Int64  "lld"
#endif
155
#endif
Simon Marlow's avatar
Simon Marlow committed
156

Simon Marlow's avatar
Simon Marlow committed
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
/* -----------------------------------------------------------------------------
   Time values in the RTS
   -------------------------------------------------------------------------- */

// For most time values in the RTS we use a fixed resolution of nanoseconds,
// normalising the time we get from platform-dependent APIs to this
// resolution.
#define TIME_RESOLUTION 1000000000
typedef StgInt64 Time;

#if TIME_RESOLUTION == 1000000000
// I'm being lazy, but it's awkward to define fully general versions of these
#define TimeToUS(t)      (t / 1000)
#define TimeToNS(t)      (t)
#define USToTime(t)      ((Time)(t) * 1000)
#define NSToTime(t)      ((Time)(t))
#else
#error Fix TimeToNS(), TimeToUS() etc.
#endif

#define SecondsToTime(t) ((Time)(t) * TIME_RESOLUTION)
#define TimeToSeconds(t) ((t) / TIME_RESOLUTION)

// Use instead of SecondsToTime() when we have a floating-point
// seconds value, to avoid truncating it.
INLINE_HEADER Time fsecondsToTime (double t)
{
    return (Time)(t * TIME_RESOLUTION);
}

187 188 189 190 191 192 193 194 195 196 197
/* -----------------------------------------------------------------------------
   Include everything STG-ish
   -------------------------------------------------------------------------- */

/* System headers: stdlib.h is eeded so that we can use NULL.  It must
 * come after MachRegs.h, because stdlib.h might define some inline
 * functions which may only be defined after register variables have
 * been declared.
 */
#include <stdlib.h>

Simon Marlow's avatar
Simon Marlow committed
198 199
#include "rts/Config.h"

200
/* Global constaints */
Simon Marlow's avatar
Simon Marlow committed
201
#include "rts/Constants.h"
202 203

/* Profiling information */
Simon Marlow's avatar
Simon Marlow committed
204 205
#include "rts/prof/CCS.h"
#include "rts/prof/LDV.h"
206 207

/* Parallel information */
Simon Marlow's avatar
Simon Marlow committed
208 209
#include "rts/OSThreads.h"
#include "rts/SpinLock.h"
210

Simon Marlow's avatar
Simon Marlow committed
211
#include "rts/Messages.h"
212

Simon Marlow's avatar
Simon Marlow committed
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
/* Storage format definitions */
#include "rts/storage/FunTypes.h"
#include "rts/storage/InfoTables.h"
#include "rts/storage/Closures.h"
#include "rts/storage/Liveness.h"
#include "rts/storage/ClosureTypes.h"
#include "rts/storage/TSO.h"
#include "stg/MiscClosures.h" /* InfoTables, closures etc. defined in the RTS */
#include "rts/storage/SMPClosureOps.h"
#include "rts/storage/Block.h"
#include "rts/storage/ClosureMacros.h"
#include "rts/storage/MBlock.h"
#include "rts/storage/GC.h"

/* Other RTS external APIs */
#include "rts/Parallel.h"
#include "rts/Hooks.h"
#include "rts/Signals.h"
231
#include "rts/BlockSignals.h"
Simon Marlow's avatar
Simon Marlow committed
232 233 234 235 236 237 238 239
#include "rts/Hpc.h"
#include "rts/Flags.h"
#include "rts/Adjustor.h"
#include "rts/FileLock.h"
#include "rts/Globals.h"
#include "rts/IOManager.h"
#include "rts/Linker.h"
#include "rts/Threads.h"
240
#include "rts/Ticky.h"
Simon Marlow's avatar
Simon Marlow committed
241 242
#include "rts/Timer.h"
#include "rts/Stable.h"
243
#include "rts/TTY.h"
244 245
#include "rts/Utils.h"
#include "rts/PrimFloat.h"
246
#include "rts/Main.h"
247 248 249 250 251 252

/* Misc stuff without a home */
DLL_IMPORT_RTS extern char **prog_argv;	/* so we can get at these from Haskell */
DLL_IMPORT_RTS extern int    prog_argc;
DLL_IMPORT_RTS extern char  *prog_name;

253 254 255 256 257 258
#ifdef mingw32_HOST_OS
// We need these two from Haskell too
void getWin32ProgArgv(int *argc, wchar_t **argv[]);
void setWin32ProgArgv(int argc, wchar_t *argv[]);
#endif

Simon Marlow's avatar
Simon Marlow committed
259
void stackOverflow(void);
260

Simon Marlow's avatar
Simon Marlow committed
261
void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
262

Simon Marlow's avatar
Simon Marlow committed
263 264 265
#ifndef mingw32_HOST_OS
int stg_sig_install (int, int, void *);
#endif
266

267
/* -----------------------------------------------------------------------------
268
   RTS Exit codes
269 270
   -------------------------------------------------------------------------- */

271 272 273 274 275 276 277 278 279 280 281
/* 255 is allegedly used by dynamic linkers to report linking failure */
#define EXIT_INTERNAL_ERROR 254
#define EXIT_DEADLOCK       253
#define EXIT_INTERRUPTED    252
#define EXIT_HEAPOVERFLOW   251
#define EXIT_KILLED         250

/* -----------------------------------------------------------------------------
   Miscellaneous garbage
   -------------------------------------------------------------------------- */

Simon Marlow's avatar
Simon Marlow committed
282 283 284 285 286 287 288 289 290 291 292 293
#ifdef DEBUG
#define TICK_VAR(arity) \
  extern StgInt SLOW_CALLS_##arity; \
  extern StgInt RIGHT_ARITY_##arity; \
  extern StgInt TAGGED_PTR_##arity;

extern StgInt TOTAL_CALLS;

TICK_VAR(1)
TICK_VAR(2)
#endif

294
/* -----------------------------------------------------------------------------
295
   Assertions and Debuggery
296 297
   -------------------------------------------------------------------------- */

298
#define IF_RTSFLAGS(c,s)  if (RtsFlags.c) { s; }
299

300
#ifdef DEBUG
301 302 303
#if IN_STG_CODE
#define IF_DEBUG(c,s)  if (RtsFlags[0].DebugFlags.c) { s; }
#else
304
#define IF_DEBUG(c,s)  if (RtsFlags.DebugFlags.c) { s; }
305
#endif
306
#else
307
#define IF_DEBUG(c,s)  doNothing()
308 309
#endif

310 311 312 313 314 315
#ifdef DEBUG
#define DEBUG_ONLY(s) s
#else
#define DEBUG_ONLY(s) doNothing()
#endif

316
/* -----------------------------------------------------------------------------
317
   Useful macros and inline functions
318 319
   -------------------------------------------------------------------------- */

sof's avatar
sof committed
320 321 322 323 324
#if defined(__GNUC__)
#define SUPPORTS_TYPEOF
#endif

#if defined(SUPPORTS_TYPEOF)
325 326
#define stg_min(a,b) ({typeof(a) _a = (a), _b = (b); _a <= _b ? _a : _b; })
#define stg_max(a,b) ({typeof(a) _a = (a), _b = (b); _a <= _b ? _b : _a; })
sof's avatar
sof committed
327 328 329 330
#else
#define stg_min(a,b) ((a) <= (b) ? (a) : (b))
#define stg_max(a,b) ((a) <= (b) ? (b) : (a))
#endif
331

332 333 334 335 336 337
/* -------------------------------------------------------------------------- */

#ifdef __cplusplus
}
#endif

338
#endif /* RTS_H */