#include <iostream>
#include <deque>
// Really want to build this list before main() started!
struct ProfilePoint;
static std::deque<ProfilePoint *> pps;
// Costly construction, but only ever with literal/constexpr params.
// Templating, etc., also discourages non-local building in reality.
struct ProfilePoint {
ProfilePoint(int id, char const *i) : id_(id), inf_(i) { pps.push_back(this); }
void doStuff() { /* ... */ }
int id_;
char const *const inf_;
};
template<class IdDescription>
struct ProfilePoint_{
static ProfilePoint p;
};
template<class IdDescription>
ProfilePoint ProfilePoint_<IdDescription>::p( IdDescription::id(), IdDescription::description() );
#define PROFILE_POINT(theid,thedescription) \
struct ppdef_static_class{ \
static int id(){ return theid; } \
static const char* description(){ return thedescription; } \
};\
static ProfilePoint_<ppdef_static_class>
// Functions like this will be called concurrently in reality.
void bar(int cnt) {
for (int i = 0; i < cnt; ++i) {
// Dropping in a local definition/call should be enough to hook in to system
PROFILE_POINT(2, "description is a string literal") pp;
pp.p.doStuff();
/* ... */
}
}
void dump() {
std::cout << "[";
for (ProfilePoint *pp : pps) { std::cout << " " << pp->id_ << ":" << pp->inf_; }
std::cout << " ]" << std::endl;
}
int main() { dump(); bar(5); dump(); } // "[ ]" then "[ 2 ]" in gcc/icc
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZGVxdWU+CgovLyBSZWFsbHkgd2FudCB0byBidWlsZCB0aGlzIGxpc3QgYmVmb3JlIG1haW4oKSBzdGFydGVkIQpzdHJ1Y3QgUHJvZmlsZVBvaW50OwpzdGF0aWMgc3RkOjpkZXF1ZTxQcm9maWxlUG9pbnQgKj4gcHBzOwoKLy8gQ29zdGx5IGNvbnN0cnVjdGlvbiwgYnV0IG9ubHkgZXZlciB3aXRoIGxpdGVyYWwvY29uc3RleHByIHBhcmFtcy4KLy8gVGVtcGxhdGluZywgZXRjLiwgYWxzbyBkaXNjb3VyYWdlcyBub24tbG9jYWwgYnVpbGRpbmcgaW4gcmVhbGl0eS4Kc3RydWN0IFByb2ZpbGVQb2ludCB7CiAgUHJvZmlsZVBvaW50KGludCBpZCwgY2hhciBjb25zdCAqaSkgOiBpZF8oaWQpLCBpbmZfKGkpIHsgcHBzLnB1c2hfYmFjayh0aGlzKTsgfQogIHZvaWQgZG9TdHVmZigpIHsgLyogLi4uICovIH0KICBpbnQgaWRfOwogIGNoYXIgY29uc3QgKmNvbnN0IGluZl87Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBJZERlc2NyaXB0aW9uPgpzdHJ1Y3QgUHJvZmlsZVBvaW50X3sKICBzdGF0aWMgUHJvZmlsZVBvaW50IHA7CiAgCgp9OwoKdGVtcGxhdGU8Y2xhc3MgSWREZXNjcmlwdGlvbj4KUHJvZmlsZVBvaW50IFByb2ZpbGVQb2ludF88SWREZXNjcmlwdGlvbj46OnAoIElkRGVzY3JpcHRpb246OmlkKCksIElkRGVzY3JpcHRpb246OmRlc2NyaXB0aW9uKCkgKTsKCiNkZWZpbmUgUFJPRklMRV9QT0lOVCh0aGVpZCx0aGVkZXNjcmlwdGlvbikgXApzdHJ1Y3QgcHBkZWZfc3RhdGljX2NsYXNzeyBcCiAgc3RhdGljIGludCBpZCgpeyByZXR1cm4gdGhlaWQ7IH0gXAogIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbigpeyByZXR1cm4gdGhlZGVzY3JpcHRpb247IH0gXAogIH07XAogIHN0YXRpYyBQcm9maWxlUG9pbnRfPHBwZGVmX3N0YXRpY19jbGFzcz4KCi8vIEZ1bmN0aW9ucyBsaWtlIHRoaXMgd2lsbCBiZSBjYWxsZWQgY29uY3VycmVudGx5IGluIHJlYWxpdHkuCnZvaWQgYmFyKGludCBjbnQpIHsKICBmb3IgKGludCBpID0gMDsgaSA8IGNudDsgKytpKSB7CiAgICAvLyBEcm9wcGluZyBpbiBhIGxvY2FsIGRlZmluaXRpb24vY2FsbCBzaG91bGQgYmUgZW5vdWdoIHRvIGhvb2sgaW4gdG8gc3lzdGVtCiAgICBQUk9GSUxFX1BPSU5UKDIsICJkZXNjcmlwdGlvbiBpcyBhIHN0cmluZyBsaXRlcmFsIikgcHA7CgogICAgcHAucC5kb1N0dWZmKCk7CiAgICAvKiAuLi4gKi8KICB9Cn0KCnZvaWQgZHVtcCgpIHsKICBzdGQ6OmNvdXQgPDwgIlsiOwogIGZvciAoUHJvZmlsZVBvaW50ICpwcCA6IHBwcykgeyBzdGQ6OmNvdXQgPDwgIiAiIDw8IHBwLT5pZF8gPDwgIjoiIDw8IHBwLT5pbmZfOyB9CiAgc3RkOjpjb3V0IDw8ICIgXSIgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsgZHVtcCgpOyBiYXIoNSk7IGR1bXAoKTsgfSAvLyAiWyBdIiB0aGVuICJbIDIgXSIgaW4gZ2NjL2ljYw==