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