/*
  Author: Laurent THOMAS, Open Cells
  copyleft: OpenAirInterface Software Alliance and it's licence
*/

#define __USE_GNU
#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "thread-pool.h"

#define SEP "\t"

uint64_t cpuCyclesMicroSec;

int main(int argc, char *argv[]) {
  if(argc != 2) {
    printf("Need one paramter: the trace Linux pipe (fifo)");
    exit(1);
  }

  mkfifo(argv[1],0666);
  int fd=open(argv[1], O_RDONLY);

  if ( fd == -1 ) {
    perror("open read mode trace file:");
    exit(1);
  }

  uint64_t deb=rdtsc();
  usleep(100000);
  cpuCyclesMicroSec=(rdtsc()-deb)/100000;
  printf("Cycles per µs: %lu\n",cpuCyclesMicroSec);
  printf("Key" SEP "delay to process" SEP "processing time" SEP "delay to be read answer\n");
  notifiedFIFO_elt_t doneRequest;

  while ( 1 ) {
    if ( read(fd,&doneRequest, sizeof(doneRequest)) ==  sizeof(doneRequest)) {
      printf("%lu" SEP "%lu" SEP "%lu" SEP "%lu" "\n",
             doneRequest.key,
             (doneRequest.startProcessingTime-doneRequest.creationTime)/cpuCyclesMicroSec,
             (doneRequest.endProcessingTime-doneRequest.startProcessingTime)/cpuCyclesMicroSec,
             (doneRequest.returnTime-doneRequest.endProcessingTime)/cpuCyclesMicroSec
            );
    } else {
      printf("no measurements\n");
      sleep(1);
    }
  }
}