aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/event.h67
-rw-r--r--mps/code/eventcnv.c12
-rw-r--r--mps/code/eventcom.h124
-rw-r--r--mps/code/eventpro.c76
-rw-r--r--mps/code/eventpro.h1
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);
27extern Word EventInternString(const char *); 27extern Word EventInternString(const char *);
28extern Word EventInternGenString(size_t, const char *); 28extern Word EventInternGenString(size_t, const char *);
29extern void EventLabelAddr(Addr, Word); 29extern void EventLabelAddr(Addr, Word);
30extern Res EventFlush(void);
30 31
31 32
32#ifdef EVENT 33#ifdef EVENT
33 34
34
35extern Res EventFlush(void);
36
37
38/* Event writing support */ 35/* Event writing support */
39 36
40extern char *EventNext, *EventLimit; 37extern 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;
83typedef EventStringStruct EventFS; 83typedef EventStringStruct EventFS;
84typedef double EventFD; 84typedef double EventFD;
85 85
86/*
87for 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. */
88typedef struct EventAnyStruct { 112typedef 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
121EVENT_LIST(EVENT_STRUCT, X) 117EVENT_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
72typedef struct { 72typedef 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
84for 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
112for 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
97static eventRecord eventTypes[] = { 136static 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
200void *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
155Bool EventCodeIsValid(EventCode code) 211Bool 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
246Res EventRead(Event *eventReturn, EventProc proc) 302Res 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);
22extern EventCode EventName2Code(char *name); 22extern EventCode EventName2Code(char *name);
23extern char *EventCode2Name(EventCode code); 23extern char *EventCode2Name(EventCode code);
24extern char *EventCode2Format(EventCode code); 24extern char *EventCode2Format(EventCode code);
25extern void *EventField(Event event, unsigned i);
25extern Bool EventCodeIsValid(EventCode code); 26extern Bool EventCodeIsValid(EventCode code);
26 27
27extern Word AddrLabel(EventProc proc, Addr addr); 28extern Word AddrLabel(EventProc proc, Addr addr);