Skip to content

Instantly share code, notes, and snippets.

@lally
Created September 6, 2019 17:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lally/8870b004d4a4cf3ad8b3c254452e00f9 to your computer and use it in GitHub Desktop.
Save lally/8870b004d4a4cf3ad8b3c254452e00f9 to your computer and use it in GitHub Desktop.
generated ppt-Minimal.cc
#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