/*************************************************************************** * Copyright 1995, Technion, Israel Institute of Technology * Electrical Eng, Software Lab. * Author: Michael Veksler. *************************************************************************** * File: shm_fragment_test.c * Purpose: Test data fragments and free list items. Allocate and free blocks. *************************************************************************** */ #include #include #define DEBUG_DEFINE_VARIABLES /* just avoid dumb errors */ #include /* for "stddeb" */ #include #include #include "shm_block.h" #include "shm_fragment.h" #include "xmalloc.h" #define DO_FREE(id) (-id) #define LIST_LENGTH 20 int main() { struct shm_block *block; char *ret; int size; int i; /* important: The test will work only for the current implementation of */ /* allocation, if the implementation will change, the list should also */ /* cahnge. */ static int sizes[LIST_LENGTH]={ SHM_MINBLOCK, /* 0: should fail */ 0x3fe0-4, /* 1: */ 0x4000-4, /* 2: */ 0x4000-4, /* 3: */ 0x4000-4+1, /* 4: should fail */ 0x4000-4, /* 5: */ /* allocated(5,3,2,1) free() */ -5, /* 6: */ 0x1c00-4, /* 7: */ 0x1400-4, /* 8: */ 0x1000-4, /* 9: */ /* allocated(9,8,7,3,2,1) free() */ -9, /* 10: */ -3, /* 11: */ -1, /* 12: */ /* allocated(8,7,2) free(9,3,1) */ 0x1000-4, /* 13: */ -13, /* 14: */ 0x1000+1-4, /* 15: */ /* allocated(8,7,15,2) free(9,[3-15],1) */ -2, /* 16: */ /* allocated(8,7,15) free(9,[3-15],1+2) */ -8, /* 17: */ -7, /* 18: */ -15 /* 19: */ }; static char *ptr[LIST_LENGTH]; block=xmalloc(SHM_MINBLOCK); /* setup first item in the free list */ shm_FragmentInit(block, sizeof(*block), SHM_MINBLOCK); fprintf(stddeb,"After shm_FragmentInit\n"); shm_print_free_list(block); for(i=0 ; i < LIST_LENGTH; i++) { size=sizes[i]; if (size>0) { /* allocate */ ret=shm_FragPtrAlloc(block, size); ptr[i]=ret; fprintf(stddeb, "%d: After shm_FragmentAlloc(block, 0x%06x) == ", i, size); if (ret==NULL) fprintf(stddeb, "NULL\n"); else { fprintf(stddeb, "0x%06x\n", (int)ret-(int)block); memset( ret,0, size ); /* test boundaries */ } } else { /* free */ /* free shm fragment */ ret=ptr[-sizes[i]]; fprintf(stddeb, "%d: Doing shm_FragmentFree(block, ", i); if (ret==NULL) fprintf(stddeb, "NULL)\n"); else fprintf(stddeb, "0x%06x)\n", (int)ret-(int)block); fflush(stddeb); shm_FragPtrFree(block, ret); } shm_print_free_list(block); } return 0; }