Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / gc / heap_predicates.c
CommitLineData
7f918cf1
CE
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
9bool 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
15bool 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
22bool 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
31bool 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
40bool isObjptrInFromSpace (GC_state s, objptr op) {
41 return (isObjptrInOldGen (s, op)
42 or isObjptrInNursery (s, op));
43}
44#endif
45
46bool 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
64bool isHeapInit (GC_heap h) {
65 return (0 == h->size);
66}