| /*************************************************************************** | |
| * 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 <assert.h> | |
| #include <stdio.h> | |
| #define DEBUG_DEFINE_VARIABLES /* just avoid dumb errors */ | |
| #include <debug.h> /* for "stddeb" */ | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #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; | |
| } |