#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Analyse lock events and compute statistics
#
# Author: Alex Bennée <alex.bennee@linaro.org>
#

from __future__ import print_function
import os
import simpletrace
import argparse
import numpy as np

class MutexAnalyser(simpletrace.Analyzer):
    "A simpletrace Analyser for checking locks."

    def __init__(self):
        self.locks = 0
        self.locked = 0
        self.unlocks = 0
        self.mutex_records = {}

    def _get_mutex(self, mutex):
        if not mutex in self.mutex_records:
            self.mutex_records[mutex] = {"locks": 0,
                                         "lock_time": 0,
                                         "acquire_times": [],
                                         "locked": 0,
                                         "locked_time": 0,
                                         "held_times": [],
                                         "unlocked": 0}

        return self.mutex_records[mutex]

    def qemu_mutex_lock(self, timestamp, mutex, filename, line):
        self.locks += 1
        rec = self._get_mutex(mutex)
        rec["locks"] += 1
        rec["lock_time"] = timestamp[0]
        rec["lock_loc"] = (filename, line)

    def qemu_mutex_locked(self, timestamp, mutex, filename, line):
        self.locked += 1
        rec = self._get_mutex(mutex)
        rec["locked"] += 1
        rec["locked_time"] = timestamp[0]
        acquire_time = rec["locked_time"] - rec["lock_time"]
        rec["locked_loc"] = (filename, line)
        rec["acquire_times"].append(acquire_time)

    def qemu_mutex_unlock(self, timestamp, mutex, filename, line):
        self.unlocks += 1
        rec = self._get_mutex(mutex)
        rec["unlocked"] += 1
        held_time = timestamp[0] - rec["locked_time"]
        rec["held_times"].append(held_time)
        rec["unlock_loc"] = (filename, line)


def get_args():
    "Grab options"
    parser = argparse.ArgumentParser()
    parser.add_argument("--output", "-o", type=str, help="Render plot to file")
    parser.add_argument("events", type=str, help='trace file read from')
    parser.add_argument("tracefile", type=str, help='trace file read from')
    return parser.parse_args()

if __name__ == '__main__':
    args = get_args()

    # Gather data from the trace
    analyser = MutexAnalyser()
    simpletrace.process(args.events, args.tracefile, analyser)

    print ("Total locks: %d, locked: %d, unlocked: %d" %
           (analyser.locks, analyser.locked, analyser.unlocks))

    # Now dump the individual lock stats
    for key, val in sorted(analyser.mutex_records.iteritems(),
                           key=lambda k_v: k_v[1]["locks"]):
        print ("Lock: %#x locks: %d, locked: %d, unlocked: %d" %
               (key, val["locks"], val["locked"], val["unlocked"]))

        acquire_times = np.array(val["acquire_times"])
        if len(acquire_times) > 0:
            print ("  Acquire Time: min:%d median:%d avg:%.2f max:%d" %
                   (acquire_times.min(), np.median(acquire_times),
                    acquire_times.mean(), acquire_times.max()))

        held_times = np.array(val["held_times"])
        if len(held_times) > 0:
            print ("  Held Time: min:%d median:%d avg:%.2f max:%d" %
                   (held_times.min(), np.median(held_times),
                    held_times.mean(), held_times.max()))

        # Check if any locks still held
        if val["locks"] > val["locked"]:
            print ("  LOCK HELD (%s:%s)" % (val["locked_loc"]))
            print ("  BLOCKED   (%s:%s)" % (val["lock_loc"]))
