extern void segment_map_test(umMem_T memory) { for (int i = 1; i <= 7; i++) { segment_map(memory, i, i * 2); } for (int i = 1; i <= 7; i++) { int reg_val = register_get(memory, i); fprintf(stderr, "regID: %d, segID: %d, segLength: %d\n", i, reg_val, segment_length(memory, reg_val)); } for (int i = 1; i <= 7; i+=2) { fprintf(stderr, "i: %d\n", i); segment_unmap(memory, i); } for (int i = 1; i <= 7; i+=2) { segment_map(memory, i, i + 10); } for (int i = 1; i <= 7; i++) { int reg_val = register_get(memory, i); fprintf(stderr, "regID: %d, segID: %d, segLength: %d\n", i, reg_val, segment_length(memory, reg_val)); } }
extern void segment_length_test(umMem_T memory) { for (int i = 0; i < 20; i+=2) { segment_map(memory, i, i * 2); int seg_length = segment_length(memory, i); if (i * 2 != seg_length) { fprintf(stderr, "Wrong length at %d\n", i); } } fprintf(stderr, "segment_length is fine with valid inputs\n"); }
extern void segment_isEmpty_test(umMem_T memory) { for (int i = 0; i < 20; i+=2) { segment_map(memory, i, i + 2); } /* odd would be empty, even is not empty */ for (int i = 0; i < 20; i++) { if ( i % 2 == 0 && segment_isEmpty(memory, i) == true) { fprintf(stderr, "Even should be not empty\n"); } else if ( i % 2 == 1 && segment_isEmpty(memory, i) == false) { fprintf(stderr, "Odd should be empty\n"); } } fprintf(stderr, "segment_isEmpty is fine with valid inputs\n"); }
static void* segment_test(void* arg) { segmentRoot_t segroot; rbtreeRoot_t rbroot; trkey_t key_large = 1; setbuf(stdout, NULL); segment_root_init(&segroot, NULL, mapper, unmapper); cdsl_rbtreeRootInit(&rbroot); segment_create_cache(&segroot, key_large); uint32_t cnt; void* segment; size_t sz; struct segment_node* segnode; clock_t clk = clock(); uint32_t seed = (uint32_t) clk; for(cnt = 0; cnt < 50; cnt++) { sz = rand_r(&seed) % (1 << 22); if(!sz) { sz = 1; } while(sz < MALLOC_UNIT_SIZE) sz <<= 1; sz &= ~3; segment = segment_map(&segroot, key_large, sz); if(!segment) { fprintf(stderr, "segment map fail %d\n",cnt); exit(-1); } segnode = (struct segment_node*) segment; cdsl_rbtreeNodeInit(&segnode->rbnode, cnt); segnode->sz = sz; cdsl_rbtreeInsert(&rbroot, &segnode->rbnode, FALSE); } __dev_log("map finished\n"); while((segnode = (struct segment_node*) cdsl_rbtreeDeleteMax(&rbroot))) { segnode = container_of(segnode, struct segment_node, rbnode); segment_unmap(&segroot,key_large, segnode, segnode->sz); } segment_cleanup(&segroot); __dev_log("finished test \n"); return NULL; }
extern void segment_PutGet_test(umMem_T memory) { uint32_t array[10]; for (int i = 0; i < 10; i++) { array[i] = (uint32_t) (i * 10); } /* Map segment 8, and store array elements in segment 8 */ segment_map(memory, 8, 10); for(int i = 0; i < 10; i++) { segment_put(memory, 8, i, array[i]); } for(int i = 0; i < 10; i++) { if (segment_get(memory, 8, i) != array[i]) { fprintf(stderr, "Offset %d has incorrect value\n", i); } } fprintf(stderr, "segment_PutGet is fine with valid inputs\n"); }
/* * map <seg-name> [<offset>[k|m|g|p] <length>[k|m|g|p]] [<seg-share>] */ static int map_seg(char *args) { glctx_t *gcp = &glctx; char *segname, *nextarg; range_t range = { 0L, 0L }; range_t *rangep = NULL; int segflag = MAP_PRIVATE; args += strspn(args, whitespace); if (!required_arg(args, "<seg-name>")) return CMD_ERROR; segname = strtok_r(args, whitespace, &nextarg); args = nextarg + strspn(nextarg, whitespace); /* * offset, length are optional */ if (get_range(args, &range, &nextarg) == CMD_ERROR) return CMD_ERROR; if (args != nextarg) { rangep = ⦥ /* override any registered range */ args = nextarg; } if (*args != '\0') { segflag = get_shared(args); if (segflag == -1) return CMD_ERROR; } if (!segment_map(segname, rangep, segflag)) return CMD_ERROR; return CMD_SUCCESS; }