/*
   util.c
*/

#include "videoport.h"

/* error handling -------------------------------------------------------- */

void error_exit(char *format, ...)
{
  va_list ap;
  
  va_start(ap, format);
  vfprintf( stdout, format, ap );
  va_end(ap);

  fprintf( stdout, "\n" );
  exit(2);
}

void perror_exit(char *format, ...)
{
  va_list ap;
  
  va_start(ap, format);
  vfprintf( stdout, format, ap );
  va_end(ap);

  fprintf( stdout, ": %s\n", strerror(oserror()) );
  exit(2);
}

void error(char *format, ...)
{
  va_list ap;

  fprintf( stdout, "---- ");

  va_start(ap, format);
  vfprintf( stdout, format, ap );
  va_end(ap);

  fprintf( stdout, "\n" );
}

void perror2(char *format, ...)
{
  va_list ap;

  fprintf( stdout, "---- ");

  va_start(ap, format);
  vfprintf( stdout, format, ap );
  va_end(ap);

  fprintf( stdout, ": %s\n", strerror(oserror()) );
}

/* utility ------------------------------------------------------------ */

diskperformance diskperformance_open(void)
{
  diskperformance me;

  NC(me = malloc(sizeof(_diskperformance)));

  me->oldestust = -1;

  return me;
}

void diskperformance_close(diskperformance me)
{
  free(me);
}

extern int videoport_max_VL_buffers_used(videoport me);

void diskperformance_datapoint(diskperformance me, off64_t bytescompleted,
                               videoport port)
{
  stamp_t now;

  dmGetUST((unsigned long long *)(&now));

  if (me->oldestust == -1)
    {
      me->oldestust = now;
      me->oldestcompleted = bytescompleted;
      me->lastreport = now;
      return;
    }

  if (now > me->lastreport + 1000000000LL)
    {
      printf("DISK %lfMB/sec (%d fields max)\n",
             1.E3 * (bytescompleted-me->oldestcompleted) / 
             (double)(now - me->oldestust),
             videoport_max_VL_buffers_used(port));
      me->lastreport = now;
      return;
    }
}

