Created
September 6, 2019 17:22
-
-
Save lally/8870b004d4a4cf3ad8b3c254452e00f9 to your computer and use it in GitHub Desktop.
generated ppt-Minimal.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "ppt-Minimal.hh" | |
#include <algorithm> | |
#include <atomic> | |
#include <cstdint> | |
#include <linux/perf_event.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <sys/shm.h> | |
#include <sys/types.h> | |
#include <syscall.h> | |
#include <time.h> | |
#include <unistd.h> | |
namespace ppt { | |
namespace Minimal { | |
extern "C" const char* _ppt_json_Minimal; | |
first * data_Minimal::ppt_buf; | |
int data_Minimal::ppt_bufsz; | |
int data_Minimal::ppt_offset; | |
int data_Minimal::ppt_counter_fd[3]; | |
const char* _ppt_json_Minimal __attribute__((used)) = "{\"abi\":\"1.0.0\",\"frames\":[{\"flLayout\":[{\"lKind\":{\"tag\":\"LKSeqno\",\"contents\":\"FrontSeq\"},\"lOffset\":0,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_seqno\"},{\"lKind\":{\"tag\":\"LKTypeDescrim\",\"contents\":2},\"lOffset\":4,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_type\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"duration\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PTime\",\"contents\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}}},{\"tag\":\"IntBegin\",\"contents\":[0,1]}]},\"lOffset\":8,\"lSize\":16,\"lType\":{\"tag\":\"PTime\",\"contents\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}},\"lAlignment\":8,\"lName\":\"duration_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"duration\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PTime\",\"contents\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}}},{\"tag\":\"IntEnd\",\"contents\":[0,1]}]},\"lOffset\":24,\"lSize\":16,\"lType\":{\"tag\":\"PTime\",\"contents\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}},\"lAlignment\":8,\"lName\":\"duration_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[0,3]}]},\"lOffset\":40,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":0},\"lAlignment\":8,\"lName\":\"events_0_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[0,3]}]},\"lOffset\":48,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":0},\"lAlignment\":8,\"lName\":\"events_0_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[1,3]}]},\"lOffset\":56,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":1},\"lAlignment\":8,\"lName\":\"events_1_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[1,3]}]},\"lOffset\":64,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":1},\"lAlignment\":8,\"lName\":\"events_1_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[2,3]}]},\"lOffset\":72,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":2},\"lAlignment\":8,\"lName\":\"events_2_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[2,3]}]},\"lOffset\":80,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":2},\"lAlignment\":8,\"lName\":\"events_2_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"a\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}},null]},\"lOffset\":88,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"a\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"b\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}},null]},\"lOffset\":92,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"b\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"c\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}},null]},\"lOffset\":96,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"c\"},{\"lKind\":{\"tag\":\"LKSeqno\",\"contents\":\"BackSeq\"},\"lOffset\":100,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_seqno_back\"}],\"flFrame\":{\"_frameElements\":[{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"a\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}}},{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"b\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}}},{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"c\",\"fmDifferential\":false,\"fmType\":{\"tag\":\"PInt\"}}},{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"duration\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PTime\",\"contents\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}}}},{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"events\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}}}],\"_frameName\":\"first\"},\"flName\":\"first\"},{\"flLayout\":[{\"lKind\":{\"tag\":\"LKSeqno\",\"contents\":\"FrontSeq\"},\"lOffset\":0,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_seqno\"},{\"lKind\":{\"tag\":\"LKTypeDescrim\",\"contents\":2},\"lOffset\":4,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_type\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[0,3]}]},\"lOffset\":8,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":0},\"lAlignment\":8,\"lName\":\"foos_0_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[0,3]}]},\"lOffset\":16,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":0},\"lAlignment\":8,\"lName\":\"foos_0_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[1,3]}]},\"lOffset\":24,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":1},\"lAlignment\":8,\"lName\":\"foos_1_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[1,3]}]},\"lOffset\":32,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":1},\"lAlignment\":8,\"lName\":\"foos_1_end\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntBegin\",\"contents\":[2,3]}]},\"lOffset\":40,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":2},\"lAlignment\":8,\"lName\":\"foos_2_start\"},{\"lKind\":{\"tag\":\"LKMember\",\"contents\":[{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}},{\"tag\":\"IntEnd\",\"contents\":[2,3]}]},\"lOffset\":48,\"lSize\":8,\"lType\":{\"tag\":\"PCounter\",\"contents\":2},\"lAlignment\":8,\"lName\":\"foos_2_end\"},{\"lKind\":{\"tag\":\"LKPadding\",\"contents\":44},\"lOffset\":56,\"lSize\":44,\"lType\":{\"tag\":\"PByte\"},\"lAlignment\":1,\"lName\":\"__ppt_endpad_44\"},{\"lKind\":{\"tag\":\"LKSeqno\",\"contents\":\"BackSeq\"},\"lOffset\":100,\"lSize\":4,\"lType\":{\"tag\":\"PInt\"},\"lAlignment\":4,\"lName\":\"__ppt_seqno_back\"}],\"flFrame\":{\"_frameElements\":[{\"tag\":\"FMemberElem\",\"contents\":{\"fmName\":\"foos\",\"fmDifferential\":true,\"fmType\":{\"tag\":\"PCounter\",\"contents\":null}}}],\"_frameName\":\"second\"},\"flName\":\"second\"}],\"metadata\":[],\"emit\":{\"_eBuffer\":{\"ebName\":\"Minimal\",\"ebMinElements\":512},\"_eOptions\":[{\"tag\":\"EDebug\",\"contents\":true}],\"_eLanguage\":\"ELangCpp\",\"_eTags\":[],\"_eRuntime\":{\"erMultithread\":true},\"_eTimeRep\":{\"tag\":\"ETimeSpec\",\"contents\":\"ETimeClockRealtime\"}},\"target\":{\"tFloat\":4,\"tInt\":4,\"tCounter\":8,\"tPadTo\":4,\"tDouble\":8,\"tTime\":16},\"tags\":[]}"; | |
int _ppt_hmem_Minimal __attribute__((used)); | |
struct ppt_stat_t { pid_t ppt_agent_pid; }; | |
extern "C" ppt_stat_t _ppt_stat_Minimal;; | |
ppt_stat_t _ppt_stat_Minimal __attribute__((used)); | |
struct perf_counter_entry { | |
uint32_t ecx; struct perf_event_attr event_attr; | |
}; | |
struct ppt_control { | |
size_t control_blk_sz; | |
uint64_t data_block_hmem; | |
uint64_t data_block_hmem_attached; | |
void* data_block; | |
size_t data_block_sz; | |
uint64_t client_flags; | |
uint32_t nr_perf_ctrs; | |
struct perf_counter_entry counterdata[3]; | |
}; | |
static ppt_control *_ppt_ctrl; | |
static std::atomic<int> s_index(1); | |
int nextIndex() { | |
return s_index.fetch_add(1, std::memory_order_release); | |
} | |
void setupCounters(); | |
void closeCounters(); | |
bool try_attach() { | |
if (data_Minimal::ppt_buf && _ppt_hmem_Minimal) { return true; } | |
if (_ppt_hmem_Minimal && !data_Minimal::ppt_buf) { | |
struct shmid_ds ds; | |
if (shmctl(_ppt_hmem_Minimal, IPC_STAT, &ds) != 0) { | |
perror("failed ppt attach of Minimal: shmctl"); | |
_ppt_hmem_Minimal = 0; | |
return false; | |
} | |
off_t elem_offset = sizeof(ppt_control) + (sizeof(ppt_control) % sizeof(first)); | |
_ppt_ctrl = reinterpret_cast<ppt_control*>(shmat(_ppt_hmem_Minimal, nullptr, 0)); | |
if (_ppt_ctrl == nullptr) { | |
perror("failed ppt attach of Minimal: shmat"); | |
_ppt_hmem_Minimal = 0; | |
return false; | |
} | |
data_Minimal::ppt_buf = reinterpret_cast<first*>(reinterpret_cast<uint8_t*>(_ppt_ctrl) + elem_offset); | |
_ppt_ctrl->data_block = data_Minimal::ppt_buf; | |
_ppt_ctrl->data_block_sz = (ds.shm_segsz - elem_offset) / sizeof(first); | |
data_Minimal::ppt_bufsz = _ppt_ctrl->data_block_sz; | |
data_Minimal::ppt_offset = data_Minimal::ppt_bufsz - ((s_index.load()-1) % data_Minimal::ppt_bufsz); | |
_ppt_ctrl->data_block_hmem_attached = _ppt_hmem_Minimal; | |
setupCounters(); | |
return true; | |
} | |
else if (data_Minimal::ppt_buf && !_ppt_hmem_Minimal) { | |
closeCounters(); | |
if (shmdt(_ppt_ctrl) != 0) { | |
perror("failed ppt detach of Minimal: shmdt"); | |
} | |
data_Minimal::ppt_buf = nullptr; | |
_ppt_ctrl = nullptr; | |
_ppt_hmem_Minimal = 0; | |
return false; | |
} | |
return false; | |
} | |
ppt_control *get_ctrl_ptr() { return _ppt_ctrl; }; | |
void setupCounters() { | |
int prior_fd = -1; | |
if (_ppt_ctrl == nullptr) return; | |
for (int i = 0 ; i < std::min<int>(_ppt_ctrl->nr_perf_ctrs, 3); i++) { | |
data_Minimal::ppt_counter_fd[i] = syscall(__NR_perf_event_open, &_ppt_ctrl->counterdata[i].event_attr, 0, -1, prior_fd, 0);; | |
prior_fd = data_Minimal::ppt_counter_fd[0]; | |
if (prior_fd < 0 || data_Minimal::ppt_counter_fd[i] < 0) { | |
perror("perf_event_open"); | |
_ppt_ctrl->nr_perf_ctrs = 0; | |
for (int j = i; j >= 0; j--) { close(data_Minimal::ppt_counter_fd[j]); data_Minimal::ppt_counter_fd[j] = 0; }; | |
return;; | |
} | |
} | |
} | |
void closeCounters() { | |
if (_ppt_ctrl == nullptr) return; | |
for (int j = std::min<int>(_ppt_ctrl->nr_perf_ctrs, 3); j >= 0; j--) { close(data_Minimal::ppt_counter_fd[j]); data_Minimal::ppt_counter_fd[j] = 0;}; | |
} | |
void save_counters(uint64_t* a, uint64_t* b, uint64_t* c) { | |
if (_ppt_ctrl != nullptr && _ppt_ctrl->nr_perf_ctrs > 0 && data_Minimal::ppt_counter_fd[0] > -1) { | |
uint64_t buf[4]; | |
read(data_Minimal::ppt_counter_fd[0], buf, (1 + _ppt_ctrl->nr_perf_ctrs) * sizeof(uint64_t)); | |
switch (_ppt_ctrl->nr_perf_ctrs) { | |
case 3: | |
*c = buf[3]; | |
case 2: | |
*b = buf[2]; | |
case 1: | |
*a = buf[1]; | |
default: break; | |
} | |
} | |
} | |
}} // namespace ppt::Minimal |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment