/*
 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
 * Distributed under the terms of the GNU General Public License v2
 */

#include <stdio.h>
#include <unistd.h>

#include "collector.h"
#include "ktop.h"
#include "syscall.h"

void pr_buf(int cpu, int sz, u8 buf[sz])
{
	int i;
	int j;

	printf("%d. trace=%d bytes\n", cpu, sz);
	for (i = 0; i < sz; i++) {
		for (j = 0; j < 32; j++, i++) {
			if (i == sz) goto done;
			printf(" %2x", buf[i]);
		}
		printf("\n");
	}
done:
	printf("\n");
}

static void pr_event(event_s *event)
{
	printf(" type=%2u flags=%2x cnt=%2d pid=%5d lock=%2d",
		event->type, event->flags, event->preempt_count, event->pid,
		event->lock_depth);
}

static void pr_sys_enter(void *event)
{
	sys_enter_s *sy = event;

	printf(" %-20s", Syscall[sy->id]);
	printf("\n");
}

static void pr_sys_exit(void *event)
{
	sys_exit_s *sy = event;

	printf(" %-20s ret=%ld\n", Syscall[sy->id], sy->ret);
}

void pr_ring_header(ring_header_s *rh)
{
	printf("ring header: %lld %lld %ld\n",
		rh->time_stamp / ONE_BILLION, rh->time_stamp % ONE_BILLION,
		rh->commit);
}

void dump_event(void *buf)
{
	event_s *event = buf;

	pr_event(event);
	if (event->type == Sys_exit) {
		pr_sys_exit(event);
	} else if (event->type == Sys_enter) {
		pr_sys_enter(event);
	} else {
		printf(" no processing\n");
	}
}

static void dump_raw(int cpu, int sz, u8 buf[sz])
{
	parse_buf(buf);	// Need to do something with sz
}

void *dump_collector(void *args)
{
	Collector_args_s *a = args;
	u8 buf[BUF_SIZE];
	int cpu = a->cpu_id;
	int trace_pipe;
	int rc;
	int i;

	drain(cpu);
	ignore_pid(gettid());
	trace_pipe = open_raw(cpu);
	for (i = 0;; i++) {
		rc = read(trace_pipe, buf, sizeof(buf));
		printf("i=%d rc=%d\n", i, rc);
		if (rc == -1) {
			close(trace_pipe);
			cleanup(0);
		}
		dump_raw(cpu, rc, buf);
		if (rc < SMALL_READ) {
			sleep(1);	// Wait for input to accumulate
		}
	}
	return NULL;
}
