#include <kern.h>
#include <stdio.h>
#include <trap.h>
#include <bsp.h>
#include <malloc.h>


#ifndef TEST_MALLOC

#define STACKSIZE 1024

extern tcb_t *cur_task;


void beep_task() ;

#endif

void test_task(){
  
  int i;
  
  char * pmem = 0 ;
  int * pmem2 = 0 ;
  
  
#ifndef TEST_MALLOC

#define NUMBER_TEST_TASKS 20

  char stacks [NUMBER_TEST_TASKS][STACKSIZE] ;  
  char names[NUMBER_TEST_TASKS][9]={
    "beep0\0" ,
    "beep1\0" ,
    "beep2\0" ,
    "beep3\0" ,
    "beep4\0" ,
    "beep5\0" ,
    "beep6\0" ,
    "beep7\0" ,
    "beep8\0" ,
    "beep9\0" ,
    "beep10\0" ,
    "beep11\0" ,
    "beep12\0" ,
    "beep13\0" ,
    "beep14\0" ,
    "beep15\0" ,
    "beep16\0" ,
    "beep17\0" ,
    "beep18\0" ,
    "beep19\0" } ;


  tcb_t * tasks[NUMBER_TEST_TASKS] ;
  delay(60) ;
  for( i = 0 ; i < NUMBER_TEST_TASKS ; i ++){
    tasks [i] = spawn( names[i]
		  , stacks[i]
		  , beep_task
		  , STACKSIZE
		  , 1000-3-i
		  , 0) ;
    if( tasks[i] == NULL ){
      printf("Spawn of %s Failed\n" , names[i]);
    }else{
      printf("Spawn of %s: Succeess\n" , names[i]);
      exec(tasks[i]);
    }
  }

#else
  
  printf("allocing 64Byte\n");
  pmem = malloc( 64*sizeof(char) ) ;
  printf("pmem:%p\n",pmem);
  pmem2 = malloc( 64*sizeof(char) ) ;
  printf("pmem2:%p\n",pmem2);
  printf("Dump of pmem:\n" ) ;
  dump( pmem , 64) ;
  printf("Dump of pmem2:\n" ) ;
  dump( pmem2 , 64) ;
  memcpy( pmem , pmem2 , 64 ) ;
  printf("Dump of pmem:\n" ) ;
  dump( pmem , 64) ;
  printf("Dump of pmem2:\n" ) ;
  dump( pmem2 , 64) ;
  free( pmem2 ) ;
  free( pmem ) ;

#endif

}

#ifndef TEST_MALLOC

void beep_task(){
  int i = 0 ;
  for(i=0;i<10;i++){
    lprintf("%s\n" , cur_task->tcb_name ) ;
    beep(400,6);
    sleep( 300 ) ;
  }
}

#endif

