#include "gskdebuglog.h"
#include <stdlib.h>
#include <string.h>

static void
usage (void)
{
  g_printerr ("usage: gsk-debug-alloc-tool LOGFILE OPERATION\n\n"
      "Analyze the output of gsk_debug_alloc_open_log().\n\n"
      "Operations:\n"
      "  usage-stats     Get min/max/average memory usage for your process.\n"
      );
  exit (1);
}

static void
do_usage_stats (GskDebugLog *log)
{
  guint64 usage = 0;
  guint64 max_usage = 0;
  GskDebugLogPacket *entry;
  while ((entry=gsk_debug_log_read (log)) != NULL)
    {
      if (entry->type == GSK_DEBUG_LOG_PACKET_MALLOC)
        {
          usage += entry->info.malloc.n_bytes;
          if (usage > max_usage)
            max_usage = usage;
        }
      else if (entry->type == GSK_DEBUG_LOG_PACKET_FREE)
        usage -= entry->info.free.n_bytes;
      gsk_debug_log_packet_free (entry);
    }
  g_print ("peak memory usage: %llu\n", max_usage);
}

int main(int argc, char **argv)
{
  const char *logfile = NULL;
  const char *op = NULL;
  GskDebugLog *log = NULL;
  guint i;
  void (*op_func) (GskDebugLog *) = NULL;
  GError *error = NULL;

  for (i = 1; i < (guint) argc; i++)
    {
      if (argv[i][0] == '-')
	{
	  usage ();
	}
      else if (logfile == NULL)
	logfile = argv[i];
      else if (op == NULL)
	{
	  op = argv[i];
	  if (strcmp (op, "usage-stats") == 0)
	    op_func = do_usage_stats;
          else
            g_error ("error: unknown operation %s", op);
	}
      else
	usage ();
    }
  if (op == NULL)
    usage ();

  log = gsk_debug_log_open (logfile, &error);
  if (log == NULL)
    g_error ("error opening debug log: %s", error->message);
  op_func (log);
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1