blob: e5903bb3b5e87a803a6dc4d599b4221eb5fb7f59 (
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
|
/* -----------------------------------------------------------------------------
*
* (c) The GHC Team, 1998-2004
*
* ---------------------------------------------------------------------------*/
#pragma once
#include "sm/GC.h" // for evac_fn below
#include "BeginPrivate.h"
void initStableNameTable ( void );
void freeSnEntry ( snEntry *sn );
void exitStableNameTable ( void );
StgWord lookupStableName ( StgPtr p );
void rememberOldStableNameAddresses ( void );
void threadStableNameTable ( evac_fn evac, void *user );
void gcStableNameTable ( void );
void updateStableNameTable ( bool full );
void stableNameLock ( void );
void stableNameUnlock ( void );
extern unsigned int SNT_size;
#define FOR_EACH_STABLE_NAME(p, CODE) \
do { \
snEntry *p; \
snEntry *__end_ptr = &stable_name_table[SNT_size]; \
for (p = stable_name_table + 1; p < __end_ptr; p++) { \
/* Internal pointers are free slots. */ \
/* If p->addr == NULL, it's a */ \
/* stable name where the object has been GC'd, but the */ \
/* StableName object (sn_obj) is still alive. */ \
if ((p->addr < (P_)stable_name_table || \
p->addr >= (P_)__end_ptr)) \
{ \
/* NOTE: There is an ambiguity here if p->addr == NULL */ \
/* it is either the last item in the free list or it */ \
/* is a stable name whose pointee died. sn_obj == NULL */ \
/* disambiguates as last free list item. */ \
do { CODE } while(0); \
} \
} \
} while(0)
#if defined(THREADED_RTS)
// needed by Schedule.c:forkProcess()
extern Mutex stable_name_mutex;
#endif
#include "EndPrivate.h"
|