#include <rtl_malloc.h>
#include <rtl.h>
#include <pthread.h>


MODULE_AUTHOR("Miguel Masmano Tello <mmasmano@disca.upv.es>");
MODULE_DESCRIPTION("Example of use DIDMA");

MODULE_LICENSE("GPL");

pthread_t thread;

#define MATRIX_N 10

void * start_routine(void *arg)
{
  int **matrix; // MATRIX_N * MATRIX_N
  int n, i, j;
 
  matrix = (int **) malloc (sizeof (int *) * MATRIX_N);
  if (matrix == NULL) {
    rtl_printf ("Error making malloc\n");
    return ((void *) 0);
  }
  

  for (n = 0; n < MATRIX_N; n++) {
    matrix [n] = (int *) malloc (sizeof (int) * MATRIX_N);
    if (matrix [n] == NULL) {
      rtl_printf ("Error making malloc\n");
      return ((void *) 0);
    }
  }
  
  for (i = 0; i < MATRIX_N; i++) {
    for (j = 0; j < MATRIX_N; j++) {
      matrix [i][j] = i + j;
    }
  }

  rtl_printf ("\n");
  for (i = 0; i < MATRIX_N; i++) {
    for (j = 0; j < MATRIX_N; j++) {
      rtl_printf ("%d ", matrix [i][j]);
    }
    rtl_printf("\n");
  }
  
  for (n = 0; n < MATRIX_N; n++) {
    if (matrix [n] != NULL) {
      free (matrix [n]);
    }
  }
  
  free (matrix);
  
  return (void *)0;
}

int init_module(void){
  return pthread_create (&thread, NULL, start_routine, 0);
}

void cleanup_module(void){
  pthread_delete_np (thread);
}
