1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h>
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdbool.h>
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdint.h>
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <assert.h>
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <string.h>
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <unistd.h>
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define __attribute(x) /* disable inlining */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "HeapBitmap.h"
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#undef __attribute
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PAGE_SIZE 4096
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define HEAP_BASE ((void *)0x10000)
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define HEAP_SIZE (5 * PAGE_SIZE + 888)
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define VERBOSE 1
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if VERBOSE
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define TRACE(...) printf(__VA_ARGS__)
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define TRACE(...) /**/
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttest_init()
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HeapBitmap hb;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool ok;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(&hb, 0x55, sizeof(hb));
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInit(&hb, HEAP_BASE, HEAP_SIZE, "test");
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.bits != NULL);
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.bitsLen >= HB_OFFSET_TO_INDEX(HEAP_SIZE));
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.base == (uintptr_t)HEAP_BASE);
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.max < hb.base);
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Make sure hb.bits is mapped.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    *hb.bits = 0x55;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(*hb.bits = 0x55);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    *hb.bits = 0;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define TEST_UNMAP 0
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if TEST_UNMAP
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Hold onto this to make sure it's unmapped later.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned long int *bits = hb.bits;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.bits == NULL);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.bitsLen == 0);
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.base == 0);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb.max == 0);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if TEST_UNMAP
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* This pointer shouldn't be mapped anymore.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    *bits = 0x55;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!"Should have segfaulted");
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool is_zeroed(const HeapBitmap *hb)
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int i;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < hb->bitsLen / sizeof (*hb->bits); i++) {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (hb->bits[i] != 0L) {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return true;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid assert_empty(const HeapBitmap *hb)
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb->bits != NULL);
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb->bitsLen >= HB_OFFSET_TO_INDEX(HEAP_SIZE));
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb->base == (uintptr_t)HEAP_BASE);
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(hb->max < hb->base);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(is_zeroed(hb));
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(hb,
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(hb,
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(hb,
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(hb,
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(hb,
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(hb,
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(hb,
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttest_bits()
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HeapBitmap hb;
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool ok;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInit(&hb, HEAP_BASE, HEAP_SIZE, "test");
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the lowest address.
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapSetObjectBit(&hb, HEAP_BASE);
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the highest address.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapSetObjectBit(&hb, HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clear the lowest address.
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapClearObjectBit(&hb, HEAP_BASE);
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!is_zeroed(&hb));
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clear the highest address.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapClearObjectBit(&hb,
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT);
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(is_zeroed(&hb));
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clean up.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb);
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttest_clear()
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HeapBitmap hb;
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool ok;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInit(&hb, HEAP_BASE, HEAP_SIZE, "test");
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the highest address.
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapSetObjectBit(&hb, HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT);
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!is_zeroed(&hb));
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clear the bitmap.
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapZero(&hb);
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb);
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clean up.
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb);
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttest_modify()
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HeapBitmap hb;
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool ok;
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned long bit;
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInit(&hb, HEAP_BASE, HEAP_SIZE, "test");
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb);
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the lowest address.
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bit = dvmHeapBitmapSetAndReturnObjectBit(&hb, HEAP_BASE);
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(bit == 0);
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the lowest address again.
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bit = dvmHeapBitmapSetAndReturnObjectBit(&hb, HEAP_BASE);
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(bit != 0);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the highest address.
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bit = dvmHeapBitmapSetAndReturnObjectBit(&hb,
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT);
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(bit == 0);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the highest address again.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bit = dvmHeapBitmapSetAndReturnObjectBit(&hb,
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT);
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(bit != 0);
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapMayContainObject(&hb,
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapMayContainObject(&hb,
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE));
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE));
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(!dvmHeapBitmapIsObjectBitSet(&hb,
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HB_OBJECT_ALIGNMENT));
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmHeapBitmapIsObjectBitSet(&hb,
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            HEAP_BASE + HEAP_SIZE - HB_OBJECT_ALIGNMENT));
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clean up.
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb);
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor test support functions
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void *gCallbackArg = NULL;
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define NUM_XOR_PTRS  128
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic size_t gNumPtrs;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void *gXorPtrs[NUM_XOR_PTRS];
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic bool gClearedPtrs[NUM_XOR_PTRS];
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic bool gSeenPtrs[NUM_XOR_PTRS];
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectxorCallback(size_t numPtrs, void **ptrs, const void *finger, void *arg)
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(numPtrs > 0);
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ptrs != NULL);
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(arg == gCallbackArg);
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsize_t i;
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < numPtrs; i++) {
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assert(ptrs[i] < finger);
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        printf("callback: 0x%08x ( < 0x%08x )\n",
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (uintptr_t)ptrs[i], (uintptr_t)finger);
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return true;
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectseenAndClearedMatch()
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    size_t i;
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < gNumPtrs; i++) {
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (gClearedPtrs[i] != gSeenPtrs[i]) {
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return true;
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectrun_xor(ssize_t offset, size_t step)
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(step != 0);
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(step < HEAP_SIZE);
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Figure out the range.
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectuintptr_t base;
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectuintptr_t top;
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (offset >= 0) {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        base = (uintptr_t)HEAP_BASE + offset;
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        base = (uintptr_t)HEAP_BASE + (uintptr_t)HEAP_SIZE + offset;
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (base < (uintptr_t)HEAP_BASE) {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        base = (uintptr_t)HEAP_BASE;
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else if (base > (uintptr_t)(HEAP_BASE + HEAP_SIZE)) {
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        base = (uintptr_t)(HEAP_BASE + HEAP_SIZE);
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        base = (base + HB_OBJECT_ALIGNMENT - 1) & ~(HB_OBJECT_ALIGNMENT - 1);
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    step *= HB_OBJECT_ALIGNMENT;
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    top = base + step * NUM_XOR_PTRS;
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (top > (uintptr_t)(HEAP_BASE + HEAP_SIZE)) {
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        top = (uintptr_t)(HEAP_BASE + HEAP_SIZE);
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Create the pointers.
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    gNumPtrs = 0;
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(gXorPtrs, 0, sizeof(gXorPtrs));
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(gClearedPtrs, 0, sizeof(gClearedPtrs));
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(gSeenPtrs, 0, sizeof(gSeenPtrs));
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectuintptr_t addr;
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid **p = gXorPtrs;
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (addr = base; addr < top; addr += step) {
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        *p++ = (void *)addr;
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        gNumPtrs++;
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(seenAndClearedMatch());
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set up the bitmaps.
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectHeapBitmap hb1, hb2;
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool ok;
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInit(&hb1, HEAP_BASE, HEAP_SIZE, "test1");
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapInitFromTemplate(&hb2, &hb1, "test2");
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Walk two empty bitmaps.
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 0\n");
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(seenAndClearedMatch());
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Walk one empty bitmap.
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 1\n");
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapSetObjectBit(&hb1, (void *)base);
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Make the bitmaps match.
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 2\n");
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapSetObjectBit(&hb2, (void *)base);
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clear the bitmaps.
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapZero(&hb1);
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb1);
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapZero(&hb2);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert_empty(&hb2);
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set the pointers we created in one of the bitmaps,
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * then visit them.
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsize_t i;
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < gNumPtrs; i++) {
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmHeapBitmapSetObjectBit(&hb1, gXorPtrs[i]);
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 3\n");
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set every third pointer in the other bitmap, and visit again.
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < gNumPtrs; i += 3) {
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmHeapBitmapSetObjectBit(&hb2, gXorPtrs[i]);
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 4\n");
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set every other pointer in the other bitmap, and visit again.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < gNumPtrs; i += 2) {
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmHeapBitmapSetObjectBit(&hb2, gXorPtrs[i]);
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 5\n");
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapXorWalk(&hb1, &hb2, xorCallback, gCallbackArg);
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Walk just one bitmap.
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTRACE("walk 6\n");
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ok = dvmHeapBitmapWalk(&hb2, xorCallback, gCallbackArg);
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(ok);
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//xxx build an expect list for the callback
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//xxx test where max points to beginning, middle, and end of a word
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Clean up.
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb1);
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmHeapBitmapDelete(&hb2);
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttest_xor()
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    run_xor(0, 1);
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    run_xor(100, 34);
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint main(int argc, char *argv[])
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("test_init...\n");
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    test_init();
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("test_bits...\n");
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    test_bits();
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("test_clear...\n");
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    test_clear();
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("test_modify...\n");
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    test_modify();
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("test_xor...\n");
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    test_xor();
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("done.\n");
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return 0;
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
497