/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#ifndef PROFILE_HH
#define PROFILE_HH

#include "error/error.hh"

// This class is used for code profiling, it properly hanldes recursion.

// Example Ussage :
//
// i4_profiler_class ph_file_open("File open");
// i4_profiler_class ph_file_close("File close");
//
// void some_function()
// {
//   ph_file_open.start();
//   open();
//   ph_file_open.stop();
//
//   ph_file_close.start();
//   close();
//   ph_file_close.stop();
// }
//
// void main_function()
// {
//   some_function();
//   //other stuff
//   some_function();
//   i4_profile_report()
// }

#include "arch.hh"

#define I4_PROFILING 1

#ifdef I4_PROFILING



extern int i4_profile_on, i4_profile_stack_top;


class i4_profile_class
{
public:
  static i4_profile_class *list;  
  i4_profile_class *next;            

  int active;
  char *name; 
  w64 total_time;

  i4_profile_class(char *debug_name);

  void called_start();     // not inlined to save program space
  void called_stop();

  void start()
  {
    // this is inlined so when profiling is off, there is no call overhead
    if (active && i4_profile_on)
      called_start();
 }

  void stop()
  {
    if (active && i4_profile_stack_top)
      called_stop();
  }

  ~i4_profile_class();
};



// clear out any profile timing information we have so far
void i4_profile_clear();                

void i4_profile_report_start();  // marks the start of a profile

// print a report to about timing since the last clear or program start
void i4_profile_report(char *filename); 

#else

void i4_profile_clear() { ; }
void i4_profile_report_start() { ; }
void i4_profile_report(char *filename) { ; }

class i4_profile_class
{
public:
  i4_profile_class(char *debug_name) {}  // make these inline so they go away
  void start()                       {}
  void stop()                        {}
};
#endif



#endif