/usr/include/hphp/util/hardware-counter.h is in hhvm-dev 3.21.0+dfsg-2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_HPHP_UTIL_HARDWARE_COUNTER_H_
#define incl_HPHP_UTIL_HARDWARE_COUNTER_H_
#include "hphp/util/thread-local.h"
#include <folly/Range.h>
#include <cstdint>
#include <vector>
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
#ifndef NO_HARDWARE_COUNTERS
struct PerfTable {
const char* name;
uint32_t type;
uint64_t config;
};
struct HardwareCounterImpl;
struct StructuredLogEntry;
/* If you change the public interface, remember to update the stubs below. */
struct HardwareCounter {
HardwareCounter();
~HardwareCounter();
static void Reset();
static int64_t GetInstructionCount();
static int64_t GetLoadCount();
static int64_t GetStoreCount();
static bool SetPerfEvents(folly::StringPiece events);
static void IncInstructionCount(int64_t amount);
static void IncLoadCount(int64_t amount);
static void IncStoreCount(int64_t amount);
typedef void (*PerfEventCallback)(const std::string&, int64_t, void*);
static void GetPerfEvents(PerfEventCallback f, void* data);
static void ClearPerfEvents();
static void UpdateServiceData(const timespec& cpu_begin,
const timespec& wall_begin,
StructuredLogEntry* entry,
bool includingPsp);
static void Init(bool enable,
const std::string& events,
bool subProc,
bool excludeKernel);
static void RecordSubprocessTimes();
static void ExcludeKernel();
static DECLARE_THREAD_LOCAL_NO_CHECK(HardwareCounter, s_counter);
bool m_countersSet{false};
private:
void reset();
int64_t getInstructionCount();
int64_t getLoadCount();
int64_t getStoreCount();
bool eventExists(const char* event);
bool addPerfEvent(const char* event);
bool setPerfEvents(folly::StringPiece events);
void getPerfEvents(PerfEventCallback f, void* data);
template<typename F>
void forEachCounter(F func);
void clearPerfEvents();
void updateServiceData(StructuredLogEntry* entry, bool includingPsp);
std::unique_ptr<HardwareCounterImpl> m_instructionCounter;
std::unique_ptr<HardwareCounterImpl> m_loadCounter;
std::unique_ptr<HardwareCounterImpl> m_storeCounter;
std::vector<std::unique_ptr<HardwareCounterImpl>> m_counters;
};
#else // NO_HARDWARE_COUNTERS
struct StructuredLogEntry;
/* Stub implementation for platforms without hardware counters (non-linux)
* This mock class pretends to track performance events, but just returns
* static values, so it doesn't even need to worry about thread safety
* for the one static instance of itself.
*/
struct HardwareCounter {
HardwareCounter() : m_countersSet(false) { }
~HardwareCounter() { }
static void Reset() { }
static int64_t GetInstructionCount() { return 0; }
static int64_t GetLoadCount() { return 0; }
static int64_t GetStoreCount() { return 0; }
static bool SetPerfEvents(folly::StringPiece events) { return false; }
static void IncInstructionCount(int64_t amount) {}
static void IncLoadCount(int64_t amount) {}
static void IncStoreCount(int64_t amount) {}
typedef void (*PerfEventCallback)(const std::string&, int64_t, void*);
static void GetPerfEvents(PerfEventCallback f, void* data) { }
static void ClearPerfEvents() { }
static void UpdateServiceData(const timespec& cpu_begin,
const timespec& wall_begin,
StructuredLogEntry* entry,
bool includingPsp) { }
static void Init(bool enable,
const std::string& events,
bool subProc,
bool excludeKernel) {}
static void RecordSubprocessTimes() {}
static void ExcludeKernel() {}
// Normally exposed by DECLARE_THREAD_LOCAL_NO_CHECK
void getCheck() { }
void destroy() { }
static HardwareCounter s_counter;
bool m_countersSet;
};
#endif // NO_HARDWARE_COUNTERS
///////////////////////////////////////////////////////////////////////////////
}
#endif
|