1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

xray: implement frame labeling

This commit is contained in:
daniel-k 2016-05-18 11:55:37 +02:00
parent 341d1f39d2
commit 91603343b0
5 changed files with 59 additions and 24 deletions

View file

@ -277,7 +277,7 @@ void reference(char *name, void (*refer)(void)) {
int k;
double start;
XRayAnnotate("name='%s'", name);
XRayLabelFrame(name);
// Calculate the required number of innerreps
innerreps = getinnerreps(refer);
@ -322,7 +322,7 @@ void benchmark(char *name, void (*test)(void))
intitest(name);
XRayAnnotate("name='%s'", name);
XRayLabelFrame(name);
for (k=0; k<=outerreps; k++) {
start = getclock();

View file

@ -68,59 +68,59 @@ int main(int argc, char **argv) {
benchmark("PARALLEL", &testpr);
XRayEndFrame(trace);
/* TEST FOR */
/* TEST FOR */
XRayStartFrame(trace);
benchmark("FOR", &testfor);
XRayEndFrame(trace);
/* TEST PARALLEL FOR */
/* TEST PARALLEL FOR */
XRayStartFrame(trace);
benchmark("PARALLEL FOR", &testpfor);
XRayEndFrame(trace);
/* TEST BARRIER */
/* TEST BARRIER */
XRayStartFrame(trace);
benchmark("BARRIER", &testbar);
benchmark("BARRIER", &testbar);
XRayEndFrame(trace);
/* TEST SINGLE */
/* TEST SINGLE */
XRayStartFrame(trace);
benchmark("SINGLE", &testsing);
benchmark("SINGLE", &testsing);
XRayEndFrame(trace);
/* TEST CRITICAL*/
/* TEST CRITICAL*/
XRayStartFrame(trace);
benchmark("CRITICAL", &testcrit);
benchmark("CRITICAL", &testcrit);
XRayEndFrame(trace);
/* TEST LOCK/UNLOCK */
/* TEST LOCK/UNLOCK */
XRayStartFrame(trace);
benchmark("LOCK/UNLOCK", &testlock);
benchmark("LOCK/UNLOCK", &testlock);
XRayEndFrame(trace);
/* TEST ORDERED SECTION */
/* TEST ORDERED SECTION */
XRayStartFrame(trace);
benchmark("ORDERED", &testorder);
benchmark("ORDERED", &testorder);
XRayEndFrame(trace);
/* GENERATE NEW REFERENCE TIME */
/* GENERATE NEW REFERENCE TIME */
XRayStartFrame(trace);
reference("reference time 2", &referatom);
reference("reference time 2", &referatom);
XRayEndFrame(trace);
/* TEST ATOMIC */
/* TEST ATOMIC */
XRayStartFrame(trace);
benchmark("ATOMIC", &testatom);
benchmark("ATOMIC", &testatom);
XRayEndFrame(trace);
/* GENERATE NEW REFERENCE TIME */
/* GENERATE NEW REFERENCE TIME */
XRayStartFrame(trace);
reference("reference time 3", &referred);
reference("reference time 3", &referred);
XRayEndFrame(trace);
/* TEST REDUCTION (1 var) */
/* TEST REDUCTION (1 var) */
XRayStartFrame(trace);
benchmark("REDUCTION", &testred);
benchmark("REDUCTION", &testred);
XRayEndFrame(trace);
#ifdef PARAVERTRACE

View file

@ -97,6 +97,7 @@ struct XRayTraceCapture {
uint32_t guard3;
struct XRayTraceBufferEntry* buffer;
struct XRayTraceFrame frame;
char frame_labels[XRAY_FRAME_LBL_BUFSIZE][XRAY_MAX_LABEL];
#ifndef XRAY_DISABLE_BROWSER_INTEGRATION
int32_t thread_id;
@ -556,7 +557,30 @@ int XRayFrameGetAnnotationCount(struct XRayTraceCapture* capture, int i) {
void XRayFrameMakeLabel(struct XRayTraceCapture* capture,
int counter,
char* label) {
snprintf(label, XRAY_MAX_LABEL, "@@@frame%d@@@", counter);
if(counter < sizeof(capture->frame_labels) && capture->frame_labels[counter][0]) {
snprintf(label, XRAY_MAX_LABEL, "%s", capture->frame_labels[counter]);
} else {
snprintf(label, XRAY_MAX_LABEL, "frame_%i", counter);
}
}
void XRayLabelFrame(const char* fmt, ...)
{
char buffer[32];
int r;
va_list args;
va_start(args, fmt);
r = vsnprintf(buffer, sizeof(buffer), fmt, args);
if(r != 0) {
const int n = XRayFrameGetHead(g_xray_capture);
if(n < sizeof(g_xray_capture->frame_labels)) {
strcpy(g_xray_capture->frame_labels[n], buffer);
} else {
puts("XRay: Not enough entries in frame label buffer");
puts(" Add -DXRAY_FRAME_LBL_BUFSIZE=[n] to your CFLAGS");
}
}
va_end(args);
}
@ -620,6 +644,11 @@ void XRayStartFrame(struct XRayTraceCapture* capture) {
GTSC(capture->frame.entry[i].start_tsc);
g_xray_capture = capture;
// initialize frame label
if(i < sizeof(capture->frame_labels)) {
capture->frame_labels[i][0] = 0;
}
#ifndef XRAY_DISABLE_BROWSER_INTEGRATION
capture->frame.entry[i].start_time = XRayGenerateTimestampsNow();
#endif

View file

@ -51,6 +51,7 @@ XRAY_NO_INSTRUMENT struct XRayTraceCapture* XRayInit(int stack_size,
XRAY_NO_INSTRUMENT void XRayShutdown(struct XRayTraceCapture* capture);
XRAY_NO_INSTRUMENT void XRayStartFrame(struct XRayTraceCapture* capture);
XRAY_NO_INSTRUMENT void XRayEndFrame(struct XRayTraceCapture* capture);
XRAY_NO_INSTRUMENT void XRayLabelFrame(const char* fmt, ...);
XRAY_NO_INSTRUMENT void XRaySetAnnotationFilter(
struct XRayTraceCapture* capture, uint32_t filter);
XRAY_NO_INSTRUMENT void XRaySaveReport(struct XRayTraceCapture* capture,
@ -95,6 +96,8 @@ inline struct XRayTraceCapture* XRayInit(int stack_size,
inline void XRayShutdown(struct XRayTraceCapture* capture) {}
inline void XRayStartFrame(struct XRayTraceCapture* capture) {}
inline void XRayEndFrame(struct XRayTraceCapture* capture) {}
inline void XRayLabelFrame(const char* fmt, ...) {}
inline void XRaySetAnnotationFilter(struct XRayTraceCapture* capture,
uint32_t filter) {}
inline void XRaySaveReport(struct XRayTraceCapture* capture,

View file

@ -38,7 +38,7 @@ extern "C" {
#define XRAY_SYMBOL_TABLE_MAX_RATIO (0.66f)
#define XRAY_LINE_SIZE (1024)
#define XRAY_MAX_FRAMES (60)
#define XRAY_MAX_LABEL (64)
#define XRAY_MAX_LABEL (32)
#define XRAY_DEFAULT_SYMBOL_TABLE_SIZE (4096)
#define XRAY_SYMBOL_POOL_NODE_SIZE (1024)
#define XRAY_GUARD_VALUE_0x12345678 (0x12345678)
@ -197,6 +197,9 @@ XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayFrameGetEndTimestampPair(
XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayGenerateTimestampsNow(void);
#endif
#ifndef XRAY_FRAME_LBL_BUFSIZE
#define XRAY_FRAME_LBL_BUFSIZE 16
#endif
#endif /* defined(XRAY) */