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