diff options
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/event.h | 67 | ||||
| -rw-r--r-- | mps/code/eventcnv.c | 12 | ||||
| -rw-r--r-- | mps/code/eventcom.h | 124 | ||||
| -rw-r--r-- | mps/code/eventpro.c | 76 | ||||
| -rw-r--r-- | mps/code/eventpro.h | 1 |
5 files changed, 161 insertions, 119 deletions
diff --git a/mps/code/event.h b/mps/code/event.h index 99373c1712f..1f113cc47a0 100644 --- a/mps/code/event.h +++ b/mps/code/event.h | |||
| @@ -27,14 +27,11 @@ extern Word EventControl(Word, Word); | |||
| 27 | extern Word EventInternString(const char *); | 27 | extern Word EventInternString(const char *); |
| 28 | extern Word EventInternGenString(size_t, const char *); | 28 | extern Word EventInternGenString(size_t, const char *); |
| 29 | extern void EventLabelAddr(Addr, Word); | 29 | extern void EventLabelAddr(Addr, Word); |
| 30 | extern Res EventFlush(void); | ||
| 30 | 31 | ||
| 31 | 32 | ||
| 32 | #ifdef EVENT | 33 | #ifdef EVENT |
| 33 | 34 | ||
| 34 | |||
| 35 | extern Res EventFlush(void); | ||
| 36 | |||
| 37 | |||
| 38 | /* Event writing support */ | 35 | /* Event writing support */ |
| 39 | 36 | ||
| 40 | extern char *EventNext, *EventLimit; | 37 | extern char *EventNext, *EventLimit; |
| @@ -59,6 +56,48 @@ extern Word EventKindControl; | |||
| 59 | END | 56 | END |
| 60 | 57 | ||
| 61 | 58 | ||
| 59 | /* EVENTn -- event emitting macros | ||
| 60 | * | ||
| 61 | * The macros EVENT0, EVENT1, etc. are used throughout the MPS to emit an | ||
| 62 | * event with parameters. They work by appending the event parameters to | ||
| 63 | * an event buffer, which is flushed to the telemetry output stream when | ||
| 64 | * full. EVENT2S is a special case that takes a variable length string. | ||
| 65 | */ | ||
| 66 | |||
| 67 | #define EVENT2S(name, p0, length, string) \ | ||
| 68 | BEGIN \ | ||
| 69 | size_t _string_len = (length); \ | ||
| 70 | size_t size; \ | ||
| 71 | size = offsetof(Event##name##Struct, f1.str) + _string_len; \ | ||
| 72 | EVENT_BEGIN(name, size) \ | ||
| 73 | _event->f0 = (p0); \ | ||
| 74 | AVER(_string_len < EventStringLengthMAX); \ | ||
| 75 | _event->f1.len = (EventStringLen)_string_len; \ | ||
| 76 | mps_lib_memcpy(_event->f1.str, (string), _string_len); \ | ||
| 77 | EVENT_END(name, size); \ | ||
| 78 | END | ||
| 79 | |||
| 80 | |||
| 81 | #define EVENT0(name) EVENT_BEGIN(name, sizeof(EventAnyStruct)) EVENT_END(name, sizeof(EventAnyStruct)) | ||
| 82 | /* The following lines were generated with | ||
| 83 | python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) EVENT_BEGIN(name, sizeof(Event##name##Struct)) %s EVENT_END(name, sizeof(Event##name##Struct))" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["_event->f%d = (p%d);" % (j, j) for j in range(0, i)]))' | ||
| 84 | */ | ||
| 85 | #define EVENT1(name, p0) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 86 | #define EVENT2(name, p0, p1) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 87 | #define EVENT3(name, p0, p1, p2) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 88 | #define EVENT4(name, p0, p1, p2, p3) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 89 | #define EVENT5(name, p0, p1, p2, p3, p4) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 90 | #define EVENT6(name, p0, p1, p2, p3, p4, p5) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 91 | #define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 92 | #define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 93 | #define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 94 | #define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 95 | #define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 96 | #define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 97 | #define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 98 | #define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); _event->f13 = (p13); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 99 | |||
| 100 | |||
| 62 | #else /* EVENT not */ | 101 | #else /* EVENT not */ |
| 63 | 102 | ||
| 64 | 103 | ||
| @@ -70,6 +109,26 @@ extern Word EventKindControl; | |||
| 70 | #define EventLabelAddr(a, i) BEGIN UNUSED(a); UNUSED(i); END | 109 | #define EventLabelAddr(a, i) BEGIN UNUSED(a); UNUSED(i); END |
| 71 | 110 | ||
| 72 | 111 | ||
| 112 | #define EVENT0(name) NOOP | ||
| 113 | /* The following lines were generated with | ||
| 114 | python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) NOOP" % (i, ", ".join(["p%d" % j for j in range(0, i)]))' | ||
| 115 | */ | ||
| 116 | #define EVENT1(name, p0) NOOP | ||
| 117 | #define EVENT2(name, p0, p1) NOOP | ||
| 118 | #define EVENT3(name, p0, p1, p2) NOOP | ||
| 119 | #define EVENT4(name, p0, p1, p2, p3) NOOP | ||
| 120 | #define EVENT5(name, p0, p1, p2, p3, p4) NOOP | ||
| 121 | #define EVENT6(name, p0, p1, p2, p3, p4, p5) NOOP | ||
| 122 | #define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) NOOP | ||
| 123 | #define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) NOOP | ||
| 124 | #define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) NOOP | ||
| 125 | #define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) NOOP | ||
| 126 | #define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) NOOP | ||
| 127 | #define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) NOOP | ||
| 128 | #define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) NOOP | ||
| 129 | #define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) NOOP | ||
| 130 | |||
| 131 | |||
| 73 | #endif /* EVENT */ | 132 | #endif /* EVENT */ |
| 74 | 133 | ||
| 75 | 134 | ||
diff --git a/mps/code/eventcnv.c b/mps/code/eventcnv.c index 4e658f3d9c1..423625f3f27 100644 --- a/mps/code/eventcnv.c +++ b/mps/code/eventcnv.c | |||
| @@ -527,16 +527,8 @@ static void readLog(EventProc proc) | |||
| 527 | printf(styleConv, (ulongest_t)event->PoolInit.f2); | 527 | printf(styleConv, (ulongest_t)event->PoolInit.f2); |
| 528 | } break; | 528 | } break; |
| 529 | default: | 529 | default: |
| 530 | for (i = 0; i < argCount; ++i) { | 530 | for (i = 0; i < argCount; ++i) |
| 531 | switch(code) { | 531 | printArg(proc, EventField(event, i), eventFormat[i], styleConv); |
| 532 | #define EVENT_CASE(X, name, code, always, kind, count, format) \ | ||
| 533 | case code: { \ | ||
| 534 | printArg(proc, EVENT##count##_FIELD_PTR(name, event, i), \ | ||
| 535 | eventFormat[i], styleConv); \ | ||
| 536 | } break; | ||
| 537 | EVENT_LIST(EVENT_CASE, X) | ||
| 538 | } | ||
| 539 | } | ||
| 540 | } | 532 | } |
| 541 | 533 | ||
| 542 | if (style == 'L') putchar(')'); | 534 | if (style == 'L') putchar(')'); |
diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h index 1db05d4c0fe..45f45b128ed 100644 --- a/mps/code/eventcom.h +++ b/mps/code/eventcom.h | |||
| @@ -83,40 +83,36 @@ typedef unsigned EventFU; | |||
| 83 | typedef EventStringStruct EventFS; | 83 | typedef EventStringStruct EventFS; |
| 84 | typedef double EventFD; | 84 | typedef double EventFD; |
| 85 | 85 | ||
| 86 | /* | ||
| 87 | for i in range(0, 15): | ||
| 88 | print "#define EVENT%d_STRUCT(%s) struct { EventCode code; EventSize size; Word clock; %s }" % ( | ||
| 89 | i, | ||
| 90 | ", ".join(["p%s" % j for j in range(0, i)]), | ||
| 91 | " ".join("EventF##p%d f%d;" % (j, j) for j in range(0,i)) | ||
| 92 | ) | ||
| 93 | */ | ||
| 94 | #define EVENT0_STRUCT() struct { EventCode code; EventSize size; Word clock; } | ||
| 95 | #define EVENT1_STRUCT(p0) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; } | ||
| 96 | #define EVENT2_STRUCT(p0, p1) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; } | ||
| 97 | #define EVENT3_STRUCT(p0, p1, p2) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; } | ||
| 98 | #define EVENT4_STRUCT(p0, p1, p2, p3) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; } | ||
| 99 | #define EVENT5_STRUCT(p0, p1, p2, p3, p4) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; } | ||
| 100 | #define EVENT6_STRUCT(p0, p1, p2, p3, p4, p5) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; } | ||
| 101 | #define EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; } | ||
| 102 | #define EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; } | ||
| 103 | #define EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; } | ||
| 104 | #define EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; } | ||
| 105 | #define EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; } | ||
| 106 | #define EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; } | ||
| 107 | #define EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; } | ||
| 108 | #define EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; EventF##p13 f13; } | ||
| 109 | |||
| 86 | /* Common prefix for all event structures. The size field allows an event | 110 | /* Common prefix for all event structures. The size field allows an event |
| 87 | reader to skip over events whose codes it does not recognise. */ | 111 | reader to skip over events whose codes it does not recognise. */ |
| 88 | typedef struct EventAnyStruct { | 112 | typedef EVENT0_STRUCT() EventAnyStruct; |
| 89 | EventCode code; | ||
| 90 | EventSize size; | ||
| 91 | Word clock; | ||
| 92 | } EventAnyStruct; | ||
| 93 | 113 | ||
| 94 | #define EVENT_STRUCT(X, name, _code, always, kind, count, format) \ | 114 | #define EVENT_STRUCT(X, name, _code, always, kind, count, format) \ |
| 95 | typedef struct Event##name##Struct { \ | 115 | typedef EVENT##count##_STRUCT format Event##name##Struct; |
| 96 | EventCode code; \ | ||
| 97 | EventSize size; \ | ||
| 98 | Word clock; \ | ||
| 99 | EVENT_STRUCT_FIELDS_##count format \ | ||
| 100 | } Event##name##Struct; | ||
| 101 | |||
| 102 | #define EVENT_STRUCT_FIELDS_0() | ||
| 103 | /* The following lines were generated with | ||
| 104 | python -c 'for i in range(1, 15): print "#define EVENT_STRUCT_FIELDS_%d(%s) %s" % (i, ", ".join(["p%s" % j for j in range(0, i)]), " ".join("EventF##p%d f%d;" % (j, j) for j in range(0,i)))' | ||
| 105 | */ | ||
| 106 | #define EVENT_STRUCT_FIELDS_1(p0) EventF##p0 f0; | ||
| 107 | #define EVENT_STRUCT_FIELDS_2(p0, p1) EventF##p0 f0; EventF##p1 f1; | ||
| 108 | #define EVENT_STRUCT_FIELDS_3(p0, p1, p2) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; | ||
| 109 | #define EVENT_STRUCT_FIELDS_4(p0, p1, p2, p3) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; | ||
| 110 | #define EVENT_STRUCT_FIELDS_5(p0, p1, p2, p3, p4) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; | ||
| 111 | #define EVENT_STRUCT_FIELDS_6(p0, p1, p2, p3, p4, p5) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; | ||
| 112 | #define EVENT_STRUCT_FIELDS_7(p0, p1, p2, p3, p4, p5, p6) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; | ||
| 113 | #define EVENT_STRUCT_FIELDS_8(p0, p1, p2, p3, p4, p5, p6, p7) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; | ||
| 114 | #define EVENT_STRUCT_FIELDS_9(p0, p1, p2, p3, p4, p5, p6, p7, p8) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; | ||
| 115 | #define EVENT_STRUCT_FIELDS_10(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; | ||
| 116 | #define EVENT_STRUCT_FIELDS_11(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; | ||
| 117 | #define EVENT_STRUCT_FIELDS_12(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; | ||
| 118 | #define EVENT_STRUCT_FIELDS_13(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; | ||
| 119 | #define EVENT_STRUCT_FIELDS_14(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; EventF##p13 f13; | ||
| 120 | 116 | ||
| 121 | EVENT_LIST(EVENT_STRUCT, X) | 117 | EVENT_LIST(EVENT_STRUCT, X) |
| 122 | 118 | ||
| @@ -137,48 +133,8 @@ typedef union EventUnion { | |||
| 137 | } EventUnion, *Event; | 133 | } EventUnion, *Event; |
| 138 | 134 | ||
| 139 | 135 | ||
| 140 | /* EVENTn -- event emitting macros | 136 | #if 0 |
| 141 | * | 137 | /* FIXME: Eliminate this in favour of some sort of table? */ |
| 142 | * The macros EVENT0, EVENT1, etc. are used throughout the MPS to emit an | ||
| 143 | * event with parameters. They work by appending the event parameters to | ||
| 144 | * an event buffer, which is flushed to the telemetry output stream when | ||
| 145 | * full. EVENT2S is a special case that takes a variable length string. | ||
| 146 | */ | ||
| 147 | |||
| 148 | #ifdef EVENT | ||
| 149 | |||
| 150 | #define EVENT2S(name, p0, length, string) \ | ||
| 151 | BEGIN \ | ||
| 152 | size_t _string_len = (length); \ | ||
| 153 | size_t size; \ | ||
| 154 | size = offsetof(Event##name##Struct, f1.str) + _string_len; \ | ||
| 155 | EVENT_BEGIN(name, size) \ | ||
| 156 | _event->f0 = (p0); \ | ||
| 157 | AVER(_string_len < EventStringLengthMAX); \ | ||
| 158 | _event->f1.len = (EventStringLen)_string_len; \ | ||
| 159 | mps_lib_memcpy(_event->f1.str, (string), _string_len); \ | ||
| 160 | EVENT_END(name, size); \ | ||
| 161 | END | ||
| 162 | |||
| 163 | #define EVENT0(name) EVENT_BEGIN(name, sizeof(EventAnyStruct)) EVENT_END(name, sizeof(EventAnyStruct)) | ||
| 164 | /* The following lines were generated with | ||
| 165 | python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) EVENT_BEGIN(name, sizeof(Event##name##Struct)) %s EVENT_END(name, sizeof(Event##name##Struct))" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["_event->f%d = (p%d);" % (j, j) for j in range(0, i)]))' | ||
| 166 | */ | ||
| 167 | #define EVENT1(name, p0) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 168 | #define EVENT2(name, p0, p1) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 169 | #define EVENT3(name, p0, p1, p2) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 170 | #define EVENT4(name, p0, p1, p2, p3) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 171 | #define EVENT5(name, p0, p1, p2, p3, p4) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 172 | #define EVENT6(name, p0, p1, p2, p3, p4, p5) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 173 | #define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 174 | #define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 175 | #define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 176 | #define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 177 | #define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 178 | #define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 179 | #define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 180 | #define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); _event->f13 = (p13); EVENT_END(name, sizeof(Event##name##Struct)) | ||
| 181 | |||
| 182 | 138 | ||
| 183 | #define EVENT0_FIELD_PTR(name, event, i) NULL | 139 | #define EVENT0_FIELD_PTR(name, event, i) NULL |
| 184 | 140 | ||
| @@ -432,29 +388,7 @@ typedef union EventUnion { | |||
| 432 | : ((i) == 17) ? (void *)&((event)->name.f17) \ | 388 | : ((i) == 17) ? (void *)&((event)->name.f17) \ |
| 433 | : ((i) == 18) ? (void *)&((event)->name.f18)\ | 389 | : ((i) == 18) ? (void *)&((event)->name.f18)\ |
| 434 | : NULL) | 390 | : NULL) |
| 435 | 391 | #endif | |
| 436 | #else /* EVENT not */ | ||
| 437 | |||
| 438 | #define EVENT0(name) NOOP | ||
| 439 | /* The following lines were generated with | ||
| 440 | python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) NOOP" % (i, ", ".join(["p%d" % j for j in range(0, i)]))' | ||
| 441 | */ | ||
| 442 | #define EVENT1(name, p0) NOOP | ||
| 443 | #define EVENT2(name, p0, p1) NOOP | ||
| 444 | #define EVENT3(name, p0, p1, p2) NOOP | ||
| 445 | #define EVENT4(name, p0, p1, p2, p3) NOOP | ||
| 446 | #define EVENT5(name, p0, p1, p2, p3, p4) NOOP | ||
| 447 | #define EVENT6(name, p0, p1, p2, p3, p4, p5) NOOP | ||
| 448 | #define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) NOOP | ||
| 449 | #define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) NOOP | ||
| 450 | #define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) NOOP | ||
| 451 | #define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) NOOP | ||
| 452 | #define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) NOOP | ||
| 453 | #define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) NOOP | ||
| 454 | #define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) NOOP | ||
| 455 | #define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) NOOP | ||
| 456 | |||
| 457 | #endif /* EVENT */ | ||
| 458 | 392 | ||
| 459 | 393 | ||
| 460 | #endif /* eventcom_h */ | 394 | #endif /* eventcom_h */ |
diff --git a/mps/code/eventpro.c b/mps/code/eventpro.c index e3a2ed320da..ac7475498e4 100644 --- a/mps/code/eventpro.c +++ b/mps/code/eventpro.c | |||
| @@ -70,14 +70,25 @@ struct EventProcStruct { | |||
| 70 | /* eventTypes -- an array containing info about the event types */ | 70 | /* eventTypes -- an array containing info about the event types */ |
| 71 | 71 | ||
| 72 | typedef struct { | 72 | typedef struct { |
| 73 | char *name; | 73 | char *name; /* Event name e.g. "TraceStart" */ |
| 74 | EventCode code; | 74 | EventCode code; |
| 75 | size_t length; | 75 | size_t size; /* event record size, rounded up from structure */ |
| 76 | char *format; | 76 | Count count; /* Parameter count */ |
| 77 | char *format; /* string format, e.g. "PPW" */ | ||
| 78 | EventSize offsets[15]; /* FIXME: literal constant */ | ||
| 77 | } eventRecord; | 79 | } eventRecord; |
| 78 | 80 | ||
| 81 | /* EVENTn_FORMAT produces a short string version of an event format, e.g. | ||
| 82 | it converts (P,P,W) into "PPW" | ||
| 83 | |||
| 84 | for i in range(1,15): | ||
| 85 | print "#define EVENT%d_FORMAT(%s) %s" % ( | ||
| 86 | i, | ||
| 87 | ", ".join(["p%d" % j for j in range(0, i)]), | ||
| 88 | " ".join(["#p%d" % j for j in range(0, i)]) | ||
| 89 | ) | ||
| 90 | */ | ||
| 79 | #define EVENT0_FORMAT() "" | 91 | #define EVENT0_FORMAT() "" |
| 80 | /* for i in range(1,15): print "#define EVENT%d_FORMAT(%s) %s" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["#p%d" % j for j in range(0, i)])) */ | ||
| 81 | #define EVENT1_FORMAT(p0) #p0 | 92 | #define EVENT1_FORMAT(p0) #p0 |
| 82 | #define EVENT2_FORMAT(p0, p1) #p0 #p1 | 93 | #define EVENT2_FORMAT(p0, p1) #p0 #p1 |
| 83 | #define EVENT3_FORMAT(p0, p1, p2) #p0 #p1 #p2 | 94 | #define EVENT3_FORMAT(p0, p1, p2) #p0 #p1 #p2 |
| @@ -94,11 +105,43 @@ typedef struct { | |||
| 94 | #define EVENT14_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 | 105 | #define EVENT14_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 |
| 95 | #define EVENT15_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 #p14 | 106 | #define EVENT15_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 #p14 |
| 96 | 107 | ||
| 108 | /* EVENTn_OFFSETS is a macro which produces an. array initializer containing | ||
| 109 | the offsets of the fields within an event structure with the specified | ||
| 110 | format. | ||
| 111 | |||
| 112 | for i in range(0, 15): | ||
| 113 | plist = ", ".join(["p%d" % i for i in range(0, i)]) | ||
| 114 | print "#define EVENT%d_OFFSETS(%s) {%s}" % ( | ||
| 115 | i, plist, | ||
| 116 | ", ".join(["offsetof(EVENT%d_STRUCT(%s), f%d)" % (i, plist, j) | ||
| 117 | for j in range(0, i)]) | ||
| 118 | ) | ||
| 119 | */ | ||
| 120 | #define EVENT0_OFFSETS() {} | ||
| 121 | #define EVENT1_OFFSETS(p0) {offsetof(EVENT1_STRUCT(p0), f0)} | ||
| 122 | #define EVENT2_OFFSETS(p0, p1) {offsetof(EVENT2_STRUCT(p0, p1), f0), offsetof(EVENT2_STRUCT(p0, p1), f1)} | ||
| 123 | #define EVENT3_OFFSETS(p0, p1, p2) {offsetof(EVENT3_STRUCT(p0, p1, p2), f0), offsetof(EVENT3_STRUCT(p0, p1, p2), f1), offsetof(EVENT3_STRUCT(p0, p1, p2), f2)} | ||
| 124 | #define EVENT4_OFFSETS(p0, p1, p2, p3) {offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f0), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f1), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f2), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f3)} | ||
| 125 | #define EVENT5_OFFSETS(p0, p1, p2, p3, p4) {offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f0), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f1), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f2), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f3), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f4)} | ||
| 126 | #define EVENT6_OFFSETS(p0, p1, p2, p3, p4, p5) {offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f0), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f1), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f2), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f3), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f4), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f5)} | ||
| 127 | #define EVENT7_OFFSETS(p0, p1, p2, p3, p4, p5, p6) {offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f0), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f1), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f2), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f3), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f4), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f5), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f6)} | ||
| 128 | #define EVENT8_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7) {offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f0), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f1), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f2), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f3), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f4), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f5), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f6), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f7)} | ||
| 129 | #define EVENT9_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8) {offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f0), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f1), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f2), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f3), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f4), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f5), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f6), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f7), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f8)} | ||
| 130 | #define EVENT10_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) {offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f0), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f1), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f2), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f3), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f4), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f5), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f6), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f7), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f8), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f9)} | ||
| 131 | #define EVENT11_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f0), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f1), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f2), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f3), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f4), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f5), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f6), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f7), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f8), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f9), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f10)} | ||
| 132 | #define EVENT12_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f0), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f1), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f2), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f3), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f4), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f5), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f6), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f7), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f8), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f9), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f10), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f11)} | ||
| 133 | #define EVENT13_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f0), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f1), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f2), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f3), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f4), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f5), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f6), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f7), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f8), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f9), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f10), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f11), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f12)} | ||
| 134 | #define EVENT14_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f0), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f1), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f2), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f3), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f4), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f5), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f6), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f7), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f8), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f9), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f10), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f11), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f12), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f13)} | ||
| 135 | |||
| 97 | static eventRecord eventTypes[] = { | 136 | static eventRecord eventTypes[] = { |
| 98 | {"(unused)", 0, 0, "0"}, | 137 | {"(unused)", 0, 0, 0, "", {}}, |
| 99 | #define EVENT_INIT(X, name, code, always, kind, count, format) \ | 138 | #define EVENT_INIT(X, name, code, always, kind, count, format) \ |
| 100 | {#name, code, \ | 139 | {#name, \ |
| 101 | EventSizeAlign(sizeof(Event##name##Struct)), EVENT##count##_FORMAT format}, | 140 | code, \ |
| 141 | EventSizeAlign(sizeof(Event##name##Struct)), \ | ||
| 142 | count, \ | ||
| 143 | EVENT##count##_FORMAT format, \ | ||
| 144 | EVENT##count##_OFFSETS format}, | ||
| 102 | EVENT_LIST(EVENT_INIT, X) | 145 | EVENT_LIST(EVENT_INIT, X) |
| 103 | }; | 146 | }; |
| 104 | 147 | ||
| @@ -152,6 +195,19 @@ char *EventCode2Format(EventCode code) | |||
| 152 | } | 195 | } |
| 153 | 196 | ||
| 154 | 197 | ||
| 198 | /* EventCode2Field -- find pointer to a field within an event */ | ||
| 199 | |||
| 200 | void *EventField(Event event, unsigned i) | ||
| 201 | { | ||
| 202 | Index j = eventCode2Index(event->any.code, TRUE); | ||
| 203 | ptrdiff_t offset; | ||
| 204 | if (i >= eventTypes[j].count) | ||
| 205 | error("Event field %u out of bounds", i); | ||
| 206 | offset = eventTypes[j].offsets[i]; | ||
| 207 | return (void *)((char *)event + offset); | ||
| 208 | } | ||
| 209 | |||
| 210 | |||
| 155 | Bool EventCodeIsValid(EventCode code) | 211 | Bool EventCodeIsValid(EventCode code) |
| 156 | { | 212 | { |
| 157 | return (eventCode2Index(code, FALSE) != 0); | 213 | return (eventCode2Index(code, FALSE) != 0); |
| @@ -245,7 +301,7 @@ EventString LabelText(EventProc proc, Word id) | |||
| 245 | 301 | ||
| 246 | Res EventRead(Event *eventReturn, EventProc proc) | 302 | Res EventRead(Event *eventReturn, EventProc proc) |
| 247 | { | 303 | { |
| 248 | size_t eventIndex, length; | 304 | size_t eventIndex, size; |
| 249 | Res res; | 305 | Res res; |
| 250 | EventCode code; | 306 | EventCode code; |
| 251 | Event event; | 307 | Event event; |
| @@ -256,7 +312,7 @@ Res EventRead(Event *eventReturn, EventProc proc) | |||
| 256 | return res; | 312 | return res; |
| 257 | 313 | ||
| 258 | eventIndex = eventCode2Index(code, TRUE); | 314 | eventIndex = eventCode2Index(code, TRUE); |
| 259 | length = eventTypes[eventIndex].length; | 315 | size = eventTypes[eventIndex].size; |
| 260 | if (proc->cachedEvent != NULL) { | 316 | if (proc->cachedEvent != NULL) { |
| 261 | event = proc->cachedEvent; | 317 | event = proc->cachedEvent; |
| 262 | proc->cachedEvent = NULL; | 318 | proc->cachedEvent = NULL; |
| @@ -282,7 +338,7 @@ Res EventRead(Event *eventReturn, EventProc proc) | |||
| 282 | if (res != ResOK) return res; | 338 | if (res != ResOK) return res; |
| 283 | } else { | 339 | } else { |
| 284 | res = proc->reader(proc->readerP, restOfEvent, | 340 | res = proc->reader(proc->readerP, restOfEvent, |
| 285 | length - sizeof(EventCode)); | 341 | size - sizeof(EventCode)); |
| 286 | if (res != ResOK) return res; | 342 | if (res != ResOK) return res; |
| 287 | } | 343 | } |
| 288 | *eventReturn = event; | 344 | *eventReturn = event; |
diff --git a/mps/code/eventpro.h b/mps/code/eventpro.h index bd6cbebfc76..608b0a36bae 100644 --- a/mps/code/eventpro.h +++ b/mps/code/eventpro.h | |||
| @@ -22,6 +22,7 @@ typedef Res (*EventProcReader)(void *, void *, size_t); | |||
| 22 | extern EventCode EventName2Code(char *name); | 22 | extern EventCode EventName2Code(char *name); |
| 23 | extern char *EventCode2Name(EventCode code); | 23 | extern char *EventCode2Name(EventCode code); |
| 24 | extern char *EventCode2Format(EventCode code); | 24 | extern char *EventCode2Format(EventCode code); |
| 25 | extern void *EventField(Event event, unsigned i); | ||
| 25 | extern Bool EventCodeIsValid(EventCode code); | 26 | extern Bool EventCodeIsValid(EventCode code); |
| 26 | 27 | ||
| 27 | extern Word AddrLabel(EventProc proc, Addr addr); | 28 | extern Word AddrLabel(EventProc proc, Addr addr); |