Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / gc / heap_predicates.c
1 /* Copyright (C) 2012,2017 Matthew Fluet.
2 * Copyright (C) 2005 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 *
5 * MLton is released under a BSD-style license.
6 * See the file MLton-LICENSE for details.
7 */
8
9 bool isPointerInOldGen (GC_state s, pointer p) {
10 return (not (isPointer (p))
11 or (s->heap.start <= p
12 and p <= s->heap.start + s->heap.oldGenSize));
13 }
14
15 bool isPointerInNursery (GC_state s, pointer p) {
16 return (not (isPointer (p))
17 or (s->heap.nursery <= p
18 and p <= s->frontier));
19 }
20
21 #if ASSERT
22 bool isObjptrInOldGen (GC_state s, objptr op) {
23 pointer p;
24 if (not (isObjptr(op)))
25 return TRUE;
26 p = objptrToPointer (op, s->heap.start);
27 return isPointerInOldGen (s, p);
28 }
29 #endif
30
31 bool isObjptrInNursery (GC_state s, objptr op) {
32 pointer p;
33 if (not (isObjptr(op)))
34 return TRUE;
35 p = objptrToPointer (op, s->heap.start);
36 return isPointerInNursery (s, p);
37 }
38
39 #if ASSERT
40 bool isObjptrInFromSpace (GC_state s, objptr op) {
41 return (isObjptrInOldGen (s, op)
42 or isObjptrInNursery (s, op));
43 }
44 #endif
45
46 bool hasHeapBytesFree (GC_state s, size_t oldGen, size_t nursery) {
47 size_t total;
48 bool res;
49
50 total =
51 s->heap.oldGenSize + oldGen
52 + (s->canMinor ? 2 : 1) * (size_t)(s->limitPlusSlop - s->heap.nursery);
53 res =
54 (total <= s->heap.size)
55 and (nursery <= (size_t)(s->limitPlusSlop - s->frontier));
56 if (DEBUG_DETAILED)
57 fprintf (stderr, "%s = hasBytesFree (%s, %s)\n",
58 boolToString (res),
59 uintmaxToCommaString(oldGen),
60 uintmaxToCommaString(nursery));
61 return res;
62 }
63
64 bool isHeapInit (GC_heap h) {
65 return (0 == h->size);
66 }