aboutsummaryrefslogtreecommitdiff
path: root/process/interrupt.cpp
blob: 4459cf64d8ade46fc307784d2c232e44541b0f46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "process.h"
#include "interrupt.h"


const char* softirqs[] = {
	"HI_SOFTIRQ",
	"timer(softirq)",
	"net tx(softirq)",
	"net_rx(softirq)",
	"block(softirq)",
	"block_iopoll(softirq)",
	"tasklet(softirq)",
	"sched(softirq)",
	"hrtimer(softirq)",
	"RCU(softirq)",
	NULL
};


interrupt::interrupt(const char *_handler, int _number)
{
	running_since = 0;
	number = _number;
	strncpy(handler, _handler, 31);
	wake_ups = 0;
	disk_hits = 0;
	accumulated_runtime = 0;
	child_runtime = 0;
	waker = NULL;
	raw_count = 0;
}


vector <class interrupt *> all_interrupts;

void interrupt::start_interrupt(uint64_t time)
{
	running_since = time;
	raw_count ++;
}

uint64_t interrupt::end_interrupt(uint64_t time)
{
	uint64_t delta;

	delta = time - running_since;
	accumulated_runtime += delta;
	return delta;
}

const char * interrupt::description(void)
{
	if (child_runtime > accumulated_runtime)
		child_runtime = 0;
	sprintf(desc, "Interrupt (%2i) %15s      time  %5.2fms    wakeups %4.1f  (child %5.1fms) (total: %i) ", number,
			handler,  (accumulated_runtime - child_runtime) / 1000000.0  / measurement_time / measurement_time, wake_ups / measurement_time, 
				child_runtime / 1000000.0, raw_count);
	return desc;
}


class interrupt * find_create_interrupt(const char *_handler, int nr, int cpu)
{
	char handler[64];
	unsigned int i;
	class interrupt *new_irq;

	strcpy(handler, _handler);
	if (strcmp(handler, "timer")==0)
		sprintf(handler, "timer/%i", cpu);
		

	for (i = 0; i < all_interrupts.size(); i++) {
		if (all_interrupts[i] && all_interrupts[i]->number == nr && strcmp(handler, all_interrupts[i]->handler) == 0)
			return all_interrupts[i];
	}

	new_irq = new class interrupt(handler, nr);
	all_interrupts.push_back(new_irq);
	return new_irq;
}

void all_interrupts_to_all_power(void)
{
	unsigned int i;
	for (i = 0; i < all_interrupts.size() ; i++)
		if (all_interrupts[i]->accumulated_runtime)
			all_power.push_back(all_interrupts[i]);
}