| /*************************************************************************** |
| * 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; |
| } |