1 /**************************************************************************** 2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * @file rdtsc_buckets.h 24 * 25 * @brief declaration for rdtsc buckets. 26 * 27 * Notes: 28 * 29 ******************************************************************************/ 30 #pragma once 31 32 #include <vector> 33 #include <cassert> 34 35 struct BUCKET 36 { 37 uint32_t id{ 0 }; 38 uint64_t start{ 0 }; 39 uint64_t elapsed{ 0 }; 40 uint32_t count{ 0 }; 41 42 BUCKET* pParent{ nullptr }; 43 std::vector<BUCKET> children; 44 }; 45 46 struct BUCKET_DESC 47 { 48 // name of bucket, used in reports 49 std::string name; 50 51 // description of bucket, used in threadviz 52 std::string description; 53 54 // enable for threadviz dumping 55 bool enableThreadViz; 56 57 // threadviz color of bucket, in RGBA8_UNORM format 58 uint32_t color; 59 }; 60 61 62 struct BUCKET_THREAD 63 { 64 // name of thread, used in reports 65 std::string name; 66 67 // id for this thread, assigned by the thread manager 68 uint32_t id{ 0 }; 69 70 // root of the bucket hierarchy for this thread 71 BUCKET root; 72 73 // currently executing bucket somewhere in the hierarchy 74 BUCKET* pCurrent{ nullptr }; 75 76 // currently executing hierarchy level 77 uint32_t level{ 0 }; 78 79 // threadviz file object 80 FILE* vizFile{ nullptr }; 81 82 83 BUCKET_THREAD() {} 84 BUCKET_THREAD(const BUCKET_THREAD& that) 85 { 86 name = that.name; 87 id = that.id; 88 root = that.root; 89 pCurrent = &root; 90 vizFile = that.vizFile; 91 } 92 }; 93 94 enum VIZ_TYPE 95 { 96 VIZ_START = 0, 97 VIZ_STOP = 1, 98 VIZ_DATA = 2 99 }; 100 101 struct VIZ_START_DATA 102 { 103 uint8_t type; 104 uint32_t bucketId; 105 uint64_t timestamp; 106 }; 107 108 struct VIZ_STOP_DATA 109 { 110 uint8_t type; 111 uint64_t timestamp; 112 }; 113 114 inline void Serialize(FILE* f, const VIZ_START_DATA& data) 115 { 116 fwrite(&data, sizeof(VIZ_START_DATA), 1, f); 117 } 118 119 inline void Deserialize(FILE* f, VIZ_START_DATA& data) 120 { 121 fread(&data, sizeof(VIZ_START_DATA), 1, f); 122 assert(data.type == VIZ_START); 123 } 124 125 inline void Serialize(FILE* f, const VIZ_STOP_DATA& data) 126 { 127 fwrite(&data, sizeof(VIZ_STOP_DATA), 1, f); 128 } 129 130 inline void Deserialize(FILE* f, VIZ_STOP_DATA& data) 131 { 132 fread(&data, sizeof(VIZ_STOP_DATA), 1, f); 133 assert(data.type == VIZ_STOP); 134 } 135 136 inline void Serialize(FILE* f, const std::string& string) 137 { 138 assert(string.size() <= 256); 139 140 uint8_t length = (uint8_t)string.size(); 141 fwrite(&length, sizeof(length), 1, f); 142 fwrite(string.c_str(), string.size(), 1, f); 143 } 144 145 inline void Deserialize(FILE* f, std::string& string) 146 { 147 char cstr[256]; 148 uint8_t length; 149 fread(&length, sizeof(length), 1, f); 150 fread(cstr, length, 1, f); 151 cstr[length] = 0; 152 string.assign(cstr); 153 } 154 155 inline void Serialize(FILE* f, const BUCKET_DESC& desc) 156 { 157 Serialize(f, desc.name); 158 Serialize(f, desc.description); 159 fwrite(&desc.enableThreadViz, sizeof(desc.enableThreadViz), 1, f); 160 fwrite(&desc.color, sizeof(desc.color), 1, f); 161 } 162 163 inline void Deserialize(FILE* f, BUCKET_DESC& desc) 164 { 165 Deserialize(f, desc.name); 166 Deserialize(f, desc.description); 167 fread(&desc.enableThreadViz, sizeof(desc.enableThreadViz), 1, f); 168 fread(&desc.color, sizeof(desc.color), 1, f); 169 } 170