aboutsummaryrefslogtreecommitdiff
path: root/daemon/SessionData.cpp
blob: f84253a3b7516a28a19c934104ac43860abb07f7 (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
93
94
95
96
97
98
99
100
/**
 * Copyright (C) ARM Limited 2010-2011. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <string.h>
#include "SessionData.h"
#include "SessionXML.h"
#include "Logging.h"
extern void handleException();

SessionData gSessionData;

SessionData::SessionData() {
	initialize();
}

SessionData::~SessionData() {
}

void SessionData::initialize() {
	mWaitingOnCommand = false;
	mSessionIsActive = false;
	mLocalCapture = false;
	mOneShot = false;
	strcpy(mCoreName, "unknown");
	apcDir = NULL;
	mSampleRate = 0;
	mDuration = 0;
	mBytes = 0;
	mBacktraceDepth = 0;
	mTotalBufferSize = 0;
	mCores = 1;
}

void SessionData::initializeCounters() {
	// PMU Counters
	for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) {
		mPerfCounterType[i][0] = 0;
		mPerfCounterTitle[i][0] = 0;
		mPerfCounterName[i][0] = 0;
		mPerfCounterDescription[i][0] = 0;
		mPerfCounterEnabled[i] = 0;
		mPerfCounterEvent[i] = 0;
		mPerfCounterColor[i] = 0;
		mPerfCounterKey[i] = 0;
		mPerfCounterCount[i] = 0;
		mPerfCounterOperation[i][0] = 0;
		mPerfCounterPerCPU[i] = false;
		mPerfCounterEBSCapable[i] = false;
	}
}

void SessionData::parseSessionXML(char* xmlString) {
	SessionXML session(xmlString);
	session.parse();

	// Parameter error checking
	if (session.parameters.output_path == 0 && session.parameters.target_path == 0) {
		logg->logError(__FILE__, __LINE__, "No capture path (target or host) was provided.");
		handleException();
	} else if (gSessionData.mLocalCapture && session.parameters.target_path == 0) {
		logg->logError(__FILE__, __LINE__, "Missing target_path tag in session xml required for a local capture.");
		handleException();
	}

	// Set session data values
	if (strcmp(session.parameters.sample_rate, "high") == 0) {
		gSessionData.mSampleRate = 10000;
	} else if (strcmp(session.parameters.sample_rate, "normal") == 0) {
		gSessionData.mSampleRate = 1000;
	} else { // "low"
		gSessionData.mSampleRate = 100;
	}
	gSessionData.mBacktraceDepth = session.parameters.call_stack_unwinding == true ? 128 : 0;
	gSessionData.mDuration = session.parameters.duration;

	// Determine buffer size (in MB) based on buffer mode
	gSessionData.mOneShot = true;
	if (strcmp(session.parameters.buffer_mode, "streaming") == 0) {
		gSessionData.mOneShot = false;
		gSessionData.mTotalBufferSize = 1;
	} else if (strcmp(session.parameters.buffer_mode, "small") == 0) {
		gSessionData.mTotalBufferSize = 1;
	} else if (strcmp(session.parameters.buffer_mode, "normal") == 0) {
		gSessionData.mTotalBufferSize = 4;
	} else if (strcmp(session.parameters.buffer_mode, "large") == 0) {
		gSessionData.mTotalBufferSize = 16;
	} else {
		logg->logError(__FILE__, __LINE__, "Invalid value for buffer mode in session xml.");
		handleException();
	}

	gSessionData.images = session.parameters.images;
	gSessionData.target_path = session.parameters.target_path;
	gSessionData.title = session.parameters.title;
}