/*
 * evtrace.c
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 */

#include "evtrace.h"

static XTime		TraceBegTime={0,0};

static void cntrl_c ()
{
  printf("***** User Termination (Ctrl-C)\n");
  traceSaveAll();
  Kabort("***** End of test *****");

}

static void sigsegv_h ()
{

  printf("***** Segmentation fault \n");
  traceSaveAll();
  Kabort("***** End of test *****");

}

int
traceRegisterAddBuf (dt *dtobj, char *buf, int len)
{
  if (! dtobj) return 1;
  return (dtAppendPostAmble(dtobj, buf, len) != XK_SUCCESS);
}

void
traceCloseFunc(dtobj, arg)
    dt *dtobj;
    void *arg;
{
  TraceStruct *ts = (TraceStruct *)arg;
  ExTraceDesc *ext;

  xAssert(dtobj);

  ext = (ExTraceDesc *)xMalloc(sizeof(ExTraceDesc));
  ext->protocol = ts->protocol;
  ext->time = time(NULL);
  ext->runTime = traceGetTime();
  ext->nbufs = dtNumPostAmble(dtobj);

  dtInsertPostAmble(dtobj, (char *)ext, sizeof(ExTraceDesc));
}

void
traceSaveAll ()
{
  static int 	saved=0;

  if (saved) return;
  dtCloseAll();
  return;
}

void
traceInit ()
{
  static int done=0;

  if (done) 
    return;
  done = 1;

#ifndef XNETSIM
  if (TraceBegTime.sec == 0  &&  TraceBegTime.usec == 0)
    xGetTime(&TraceBegTime);
#endif

  /* --- Install signal handler */
  if ((signal(SIGINT, cntrl_c) == SIG_ERR)) 
     Kabort("Could not install signal handler for cntrl-c\n");
  if ((signal(SIGQUIT, cntrl_c) == SIG_ERR))
    Kabort("Could not install signal handler for quit\n");
  if ((signal(SIGSEGV, sigsegv_h) == SIG_ERR))
    Kabort("Could not install signal handler for sigsegv\n");
}

/*                
 * traceGetTime
 */
long traceGetTime ()
{   
  XTime curTime;
  
  xGetTime(&curTime);
  return ((curTime.sec - TraceBegTime.sec)*1000000 +
                  (curTime.usec - TraceBegTime.usec));
} 
 

