#include <stdio.h>

#include "defs.h"
#include "disk.h"
#include "minithread.h"
#include "minimsg.h"
#include "synch.h"

void disk_handler(void* arg){
  char* name_type;
  char* name_reply;
  
  disk_interrupt_arg_t* disk_interrupt = 
    (disk_interrupt_arg_t*) arg;
  
  switch(disk_interrupt->request.type){
  case DISK_RESET:
    name_type="RESET";
    break;
  case DISK_SHUTDOWN:
    name_type="SHUTDOWN";
    break;
  case DISK_READ:
    name_type="READ";
    break;
  case DISK_WRITE:
    name_type="WRITE";
    break;
  default:
    name_type="UNKNOWN";
  }

  switch(disk_interrupt->reply){
  case DISK_REPLY_OK:
    name_reply="OK";
    break;
  case DISK_REPLY_FAILED:
    name_reply="FAILED";
    break;
  case DISK_REPLY_ERROR:
    name_reply="ERROR";
    break;
  case DISK_REPLY_CRASHED:
    name_reply="CRASHED";
    break;
  default:
    name_reply="UNKNOWN";
  }
  printf("Disk Interrupt: request %s for block %d has reply  %s.\n", name_type,
	 disk_interrupt->request.blocknum, name_reply);
  
  /* distroy the reply */
  free(disk_interrupt); 
}

int disk_main(void* arg){
  disk_t* disk1;
  char buffer[DISK_BLOCK_SIZE];
  int i;

  install_disk_handler(disk_handler);
  disk1 = (disk_t*) malloc(sizeof(disk_t));
  disk_create(disk1, "disk1", 101, DISK_READWRITE);

  memset((void*)buffer, 'x', DISK_BLOCK_SIZE);

  for (i=0; i<100; i++){
    disk_write_block(disk1, i, buffer);
  }

  /* disk_shutdown(disk1); */

  for (;;);
}

void main(void)
{
  crash_rate=.01;
  failure_rate=.1;
  reordering_rate=.5;

  minithread_system_initialize(disk_main,NULL);
}

  
  
  
