aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2012-08-26 15:31:40 +0100
committerRichard Brooksby2012-08-26 15:31:40 +0100
commit0506bc8cbfd4861aff2ce9032c6a712094931ff6 (patch)
tree5c84f77b480d44208a68a5ece2c53bda44275b71 /mps/code
parent3208f37aefaa8c7152ff70722ab4cd2eb2b4b300 (diff)
parent64f400c160c5246de16d69ff56d88176656c27ff (diff)
downloademacs-0506bc8cbfd4861aff2ce9032c6a712094931ff6.tar.gz
emacs-0506bc8cbfd4861aff2ce9032c6a712094931ff6.zip
Using fast clock to timestamp events, making event logging much quicker.
Copied from Perforce Change: 179055 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/event.h48
-rw-r--r--mps/code/eventcnv.c15
-rw-r--r--mps/code/eventcom.h291
3 files changed, 73 insertions, 281 deletions
diff --git a/mps/code/event.h b/mps/code/event.h
index 1f113cc47a0..fed563f6117 100644
--- a/mps/code/event.h
+++ b/mps/code/event.h
@@ -37,6 +37,51 @@ extern Res EventFlush(void);
37extern char *EventNext, *EventLimit; 37extern char *EventNext, *EventLimit;
38extern Word EventKindControl; 38extern Word EventKindControl;
39 39
40
41/* EVENT_CLOCK -- fast event timestamp clock
42 *
43 * On platforms that support it, we want to stamp events with a very cheap
44 * and fast high-resolution timer.
45 */
46
47/* http://clang.llvm.org/docs/LanguageExtensions.html#builtins */
48#if defined(MPS_BUILD_LL) && __has_builtin(__builtin_readcyclecounter)
49
50#define EVENT_CLOCK(lvalue) \
51 BEGIN \
52 (lvalue) = __builtin_readcyclecounter(); \
53 END
54
55/* http://msdn.microsoft.com/en-US/library/twchhe95%28v=vs.100%29.aspx */
56#elif (defined(MPS_ARCH_I3) || defined(MPS_ARCH_I6)) && defined(MPS_BUILD_MV)
57
58#pragma intrinsic(__rdtsc)
59#define EVENT_CLOCK(lvalue) \
60 BEGIN \
61 (lvalue) = __rdtsc(); \
62 END
63
64/* Assemble the rdtsc instruction */
65#elif (defined(MPS_ARCH_I3) || defined(MPS_ARCH_I6)) && \
66 (defined(MPS_BUILD_GC) || defined(MPS_BUILD_LL))
67
68#define EVENT_CLOCK(lvalue) \
69 BEGIN \
70 unsigned _l, _h; \
71 __asm__ __volatile__("rdtsc" : "=a"(_l), "=d"(_h)); \
72 (lvalue) = ((unsigned long long)_h << 32) | _l; \
73 END
74
75#else /* no fast clock, use plinth, probably from the C library */
76
77#define EVENT_CLOCK(lvalue) \
78 BEGIN \
79 (lvalue) = mps_clock(); \
80 END
81
82#endif
83
84
40#define EVENT_BEGIN(name, structSize) \ 85#define EVENT_BEGIN(name, structSize) \
41 BEGIN \ 86 BEGIN \
42 if(BS_IS_MEMBER(EventKindControl, ((Index)Event##name##Kind))) { \ 87 if(BS_IS_MEMBER(EventKindControl, ((Index)Event##name##Kind))) { \
@@ -48,7 +93,8 @@ extern Word EventKindControl;
48 _event = (void *)EventNext; \ 93 _event = (void *)EventNext; \
49 _event->code = Event##name##Code; \ 94 _event->code = Event##name##Code; \
50 _event->size = (EventSize)_size; \ 95 _event->size = (EventSize)_size; \
51 _event->clock = mps_clock(); 96 { unsigned l, h; __asm__ __volatile__("rdtsc":"=a"(l),"=d"(h)); \
97 _event->clock = ((unsigned long long)h << 32) | l; }
52 98
53#define EVENT_END(name, size) \ 99#define EVENT_END(name, size) \
54 EventNext += _size; \ 100 EventNext += _size; \
diff --git a/mps/code/eventcnv.c b/mps/code/eventcnv.c
index 423625f3f27..4fac8bbc4d8 100644
--- a/mps/code/eventcnv.c
+++ b/mps/code/eventcnv.c
@@ -35,7 +35,7 @@ typedef unsigned int uint;
35typedef unsigned long ulong; 35typedef unsigned long ulong;
36 36
37 37
38static Word eventTime; /* current event time */ 38static EventClock eventTime; /* current event time */
39 39
40 40
41/* event counters */ 41/* event counters */
@@ -404,7 +404,6 @@ static void readLog(EventProc proc)
404 404
405 while (TRUE) { /* loop for each event */ 405 while (TRUE) { /* loop for each event */
406 char *eventFormat; 406 char *eventFormat;
407 size_t argCount, i;
408 Event event; 407 Event event;
409 EventCode code; 408 EventCode code;
410 Res res; 409 Res res;
@@ -431,6 +430,7 @@ static void readLog(EventProc proc)
431 430
432 /* Output event. */ 431 /* Output event. */
433 if (verbose) { 432 if (verbose) {
433 size_t argCount;
434 eventFormat = EventCode2Format(code); 434 eventFormat = EventCode2Format(code);
435 argCount = strlen(eventFormat); 435 argCount = strlen(eventFormat);
436 if (eventFormat[0] == '0') argCount = 0; 436 if (eventFormat[0] == '0') argCount = 0;
@@ -527,8 +527,11 @@ 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 {
531 printArg(proc, EventField(event, i), eventFormat[i], styleConv); 531 unsigned i;
532 for (i = 0; i < argCount; ++i)
533 printArg(proc, EventField(event, i), eventFormat[i], styleConv);
534 }
532 } 535 }
533 536
534 if (style == 'L') putchar(')'); 537 if (style == 'L') putchar(')');
@@ -553,7 +556,7 @@ static void readLog(EventProc proc)
553 printf("(t"); 556 printf("(t");
554 } break; 557 } break;
555 case 'C': { 558 case 'C': {
556 printf("%lu", eventTime+1); 559 printf("%llu", eventTime+1);
557 } break; 560 } break;
558 } 561 }
559 reportEventResults(totalEventCount); 562 reportEventResults(totalEventCount);
@@ -565,7 +568,7 @@ static void readLog(EventProc proc)
565 if (eventEnabled[c]) 568 if (eventEnabled[c])
566 printf(" %04X %s\n", (unsigned)c, EventCode2Name(c)); 569 printf(" %04X %s\n", (unsigned)c, EventCode2Name(c));
567 if (bucketSize == 0) 570 if (bucketSize == 0)
568 printf("\nevent clock stopped at %"PRIuLONGEST"\n", (ulongest_t)eventTime); 571 printf("\nevent clock stopped at %llu\n", eventTime);
569 } 572 }
570 } 573 }
571} 574}
diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h
index 45f45b128ed..1871859c23a 100644
--- a/mps/code/eventcom.h
+++ b/mps/code/eventcom.h
@@ -16,6 +16,7 @@
16 16
17/* Types for event fields */ 17/* Types for event fields */
18 18
19typedef unsigned long long EventClock;
19typedef unsigned short EventCode; 20typedef unsigned short EventCode;
20typedef unsigned EventKind; 21typedef unsigned EventKind;
21typedef unsigned short EventSize; 22typedef unsigned short EventSize;
@@ -85,27 +86,27 @@ typedef double EventFD;
85 86
86/* 87/*
87for i in range(0, 15): 88for i in range(0, 15):
88 print "#define EVENT%d_STRUCT(%s) struct { EventCode code; EventSize size; Word clock; %s }" % ( 89 print "#define EVENT%d_STRUCT(%s) struct { EventCode code; EventSize size; EventClock clock; %s }" % (
89 i, 90 i,
90 ", ".join(["p%s" % j for j in range(0, i)]), 91 ", ".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 " ".join("EventF##p%d f%d;" % (j, j) for j in range(0,i))
92 ) 93 )
93 */ 94 */
94#define EVENT0_STRUCT() struct { EventCode code; EventSize size; Word clock; } 95#define EVENT0_STRUCT() struct { EventCode code; EventSize size; EventClock clock; }
95#define EVENT1_STRUCT(p0) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; } 96#define EVENT1_STRUCT(p0) struct { EventCode code; EventSize size; EventClock 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 EVENT2_STRUCT(p0, p1) struct { EventCode code; EventSize size; EventClock 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 EVENT3_STRUCT(p0, p1, p2) struct { EventCode code; EventSize size; EventClock 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 EVENT4_STRUCT(p0, p1, p2, p3) struct { EventCode code; EventSize size; EventClock 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 EVENT5_STRUCT(p0, p1, p2, p3, p4) struct { EventCode code; EventSize size; EventClock 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 EVENT6_STRUCT(p0, p1, p2, p3, p4, p5) struct { EventCode code; EventSize size; EventClock 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 EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6) struct { EventCode code; EventSize size; EventClock 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 EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7) struct { EventCode code; EventSize size; EventClock 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 EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8) struct { EventCode code; EventSize size; EventClock 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 EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) struct { EventCode code; EventSize size; EventClock 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 EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) struct { EventCode code; EventSize size; EventClock 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 EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) struct { EventCode code; EventSize size; EventClock 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 EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) struct { EventCode code; EventSize size; EventClock 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#define EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) struct { EventCode code; EventSize size; EventClock 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 110
110/* Common prefix for all event structures. The size field allows an event 111/* Common prefix for all event structures. The size field allows an event
111 reader to skip over events whose codes it does not recognise. */ 112 reader to skip over events whose codes it does not recognise. */
@@ -133,264 +134,6 @@ typedef union EventUnion {
133} EventUnion, *Event; 134} EventUnion, *Event;
134 135
135 136
136#if 0
137/* FIXME: Eliminate this in favour of some sort of table? */
138
139#define EVENT0_FIELD_PTR(name, event, i) NULL
140
141/*
142 for i in range(1,20): print "#define EVENT%d_FIELD_PTR(name, event, i) ( \\\n %s\\\n : NULL)\n" % (i, " \\\n : ".join(["((i) == %d) ? (void *)&((event)->name.f%d)" % (j, j) for j in range(0, i)]))
143 */
144
145#define EVENT1_FIELD_PTR(name, event, i) ( \
146 ((i) == 0) ? (void *)&((event)->name.f0)\
147 : NULL)
148
149#define EVENT2_FIELD_PTR(name, event, i) ( \
150 ((i) == 0) ? (void *)&((event)->name.f0) \
151 : ((i) == 1) ? (void *)&((event)->name.f1)\
152 : NULL)
153
154#define EVENT3_FIELD_PTR(name, event, i) ( \
155 ((i) == 0) ? (void *)&((event)->name.f0) \
156 : ((i) == 1) ? (void *)&((event)->name.f1) \
157 : ((i) == 2) ? (void *)&((event)->name.f2)\
158 : NULL)
159
160#define EVENT4_FIELD_PTR(name, event, i) ( \
161 ((i) == 0) ? (void *)&((event)->name.f0) \
162 : ((i) == 1) ? (void *)&((event)->name.f1) \
163 : ((i) == 2) ? (void *)&((event)->name.f2) \
164 : ((i) == 3) ? (void *)&((event)->name.f3)\
165 : NULL)
166
167#define EVENT5_FIELD_PTR(name, event, i) ( \
168 ((i) == 0) ? (void *)&((event)->name.f0) \
169 : ((i) == 1) ? (void *)&((event)->name.f1) \
170 : ((i) == 2) ? (void *)&((event)->name.f2) \
171 : ((i) == 3) ? (void *)&((event)->name.f3) \
172 : ((i) == 4) ? (void *)&((event)->name.f4)\
173 : NULL)
174
175#define EVENT6_FIELD_PTR(name, event, i) ( \
176 ((i) == 0) ? (void *)&((event)->name.f0) \
177 : ((i) == 1) ? (void *)&((event)->name.f1) \
178 : ((i) == 2) ? (void *)&((event)->name.f2) \
179 : ((i) == 3) ? (void *)&((event)->name.f3) \
180 : ((i) == 4) ? (void *)&((event)->name.f4) \
181 : ((i) == 5) ? (void *)&((event)->name.f5)\
182 : NULL)
183
184#define EVENT7_FIELD_PTR(name, event, i) ( \
185 ((i) == 0) ? (void *)&((event)->name.f0) \
186 : ((i) == 1) ? (void *)&((event)->name.f1) \
187 : ((i) == 2) ? (void *)&((event)->name.f2) \
188 : ((i) == 3) ? (void *)&((event)->name.f3) \
189 : ((i) == 4) ? (void *)&((event)->name.f4) \
190 : ((i) == 5) ? (void *)&((event)->name.f5) \
191 : ((i) == 6) ? (void *)&((event)->name.f6)\
192 : NULL)
193
194#define EVENT8_FIELD_PTR(name, event, i) ( \
195 ((i) == 0) ? (void *)&((event)->name.f0) \
196 : ((i) == 1) ? (void *)&((event)->name.f1) \
197 : ((i) == 2) ? (void *)&((event)->name.f2) \
198 : ((i) == 3) ? (void *)&((event)->name.f3) \
199 : ((i) == 4) ? (void *)&((event)->name.f4) \
200 : ((i) == 5) ? (void *)&((event)->name.f5) \
201 : ((i) == 6) ? (void *)&((event)->name.f6) \
202 : ((i) == 7) ? (void *)&((event)->name.f7)\
203 : NULL)
204
205#define EVENT9_FIELD_PTR(name, event, i) ( \
206 ((i) == 0) ? (void *)&((event)->name.f0) \
207 : ((i) == 1) ? (void *)&((event)->name.f1) \
208 : ((i) == 2) ? (void *)&((event)->name.f2) \
209 : ((i) == 3) ? (void *)&((event)->name.f3) \
210 : ((i) == 4) ? (void *)&((event)->name.f4) \
211 : ((i) == 5) ? (void *)&((event)->name.f5) \
212 : ((i) == 6) ? (void *)&((event)->name.f6) \
213 : ((i) == 7) ? (void *)&((event)->name.f7) \
214 : ((i) == 8) ? (void *)&((event)->name.f8)\
215 : NULL)
216
217#define EVENT10_FIELD_PTR(name, event, i) ( \
218 ((i) == 0) ? (void *)&((event)->name.f0) \
219 : ((i) == 1) ? (void *)&((event)->name.f1) \
220 : ((i) == 2) ? (void *)&((event)->name.f2) \
221 : ((i) == 3) ? (void *)&((event)->name.f3) \
222 : ((i) == 4) ? (void *)&((event)->name.f4) \
223 : ((i) == 5) ? (void *)&((event)->name.f5) \
224 : ((i) == 6) ? (void *)&((event)->name.f6) \
225 : ((i) == 7) ? (void *)&((event)->name.f7) \
226 : ((i) == 8) ? (void *)&((event)->name.f8) \
227 : ((i) == 9) ? (void *)&((event)->name.f9)\
228 : NULL)
229
230#define EVENT11_FIELD_PTR(name, event, i) ( \
231 ((i) == 0) ? (void *)&((event)->name.f0) \
232 : ((i) == 1) ? (void *)&((event)->name.f1) \
233 : ((i) == 2) ? (void *)&((event)->name.f2) \
234 : ((i) == 3) ? (void *)&((event)->name.f3) \
235 : ((i) == 4) ? (void *)&((event)->name.f4) \
236 : ((i) == 5) ? (void *)&((event)->name.f5) \
237 : ((i) == 6) ? (void *)&((event)->name.f6) \
238 : ((i) == 7) ? (void *)&((event)->name.f7) \
239 : ((i) == 8) ? (void *)&((event)->name.f8) \
240 : ((i) == 9) ? (void *)&((event)->name.f9) \
241 : ((i) == 10) ? (void *)&((event)->name.f10)\
242 : NULL)
243
244#define EVENT12_FIELD_PTR(name, event, i) ( \
245 ((i) == 0) ? (void *)&((event)->name.f0) \
246 : ((i) == 1) ? (void *)&((event)->name.f1) \
247 : ((i) == 2) ? (void *)&((event)->name.f2) \
248 : ((i) == 3) ? (void *)&((event)->name.f3) \
249 : ((i) == 4) ? (void *)&((event)->name.f4) \
250 : ((i) == 5) ? (void *)&((event)->name.f5) \
251 : ((i) == 6) ? (void *)&((event)->name.f6) \
252 : ((i) == 7) ? (void *)&((event)->name.f7) \
253 : ((i) == 8) ? (void *)&((event)->name.f8) \
254 : ((i) == 9) ? (void *)&((event)->name.f9) \
255 : ((i) == 10) ? (void *)&((event)->name.f10) \
256 : ((i) == 11) ? (void *)&((event)->name.f11)\
257 : NULL)
258
259#define EVENT13_FIELD_PTR(name, event, i) ( \
260 ((i) == 0) ? (void *)&((event)->name.f0) \
261 : ((i) == 1) ? (void *)&((event)->name.f1) \
262 : ((i) == 2) ? (void *)&((event)->name.f2) \
263 : ((i) == 3) ? (void *)&((event)->name.f3) \
264 : ((i) == 4) ? (void *)&((event)->name.f4) \
265 : ((i) == 5) ? (void *)&((event)->name.f5) \
266 : ((i) == 6) ? (void *)&((event)->name.f6) \
267 : ((i) == 7) ? (void *)&((event)->name.f7) \
268 : ((i) == 8) ? (void *)&((event)->name.f8) \
269 : ((i) == 9) ? (void *)&((event)->name.f9) \
270 : ((i) == 10) ? (void *)&((event)->name.f10) \
271 : ((i) == 11) ? (void *)&((event)->name.f11) \
272 : ((i) == 12) ? (void *)&((event)->name.f12)\
273 : NULL)
274
275#define EVENT14_FIELD_PTR(name, event, i) ( \
276 ((i) == 0) ? (void *)&((event)->name.f0) \
277 : ((i) == 1) ? (void *)&((event)->name.f1) \
278 : ((i) == 2) ? (void *)&((event)->name.f2) \
279 : ((i) == 3) ? (void *)&((event)->name.f3) \
280 : ((i) == 4) ? (void *)&((event)->name.f4) \
281 : ((i) == 5) ? (void *)&((event)->name.f5) \
282 : ((i) == 6) ? (void *)&((event)->name.f6) \
283 : ((i) == 7) ? (void *)&((event)->name.f7) \
284 : ((i) == 8) ? (void *)&((event)->name.f8) \
285 : ((i) == 9) ? (void *)&((event)->name.f9) \
286 : ((i) == 10) ? (void *)&((event)->name.f10) \
287 : ((i) == 11) ? (void *)&((event)->name.f11) \
288 : ((i) == 12) ? (void *)&((event)->name.f12) \
289 : ((i) == 13) ? (void *)&((event)->name.f13)\
290 : NULL)
291
292#define EVENT15_FIELD_PTR(name, event, i) ( \
293 ((i) == 0) ? (void *)&((event)->name.f0) \
294 : ((i) == 1) ? (void *)&((event)->name.f1) \
295 : ((i) == 2) ? (void *)&((event)->name.f2) \
296 : ((i) == 3) ? (void *)&((event)->name.f3) \
297 : ((i) == 4) ? (void *)&((event)->name.f4) \
298 : ((i) == 5) ? (void *)&((event)->name.f5) \
299 : ((i) == 6) ? (void *)&((event)->name.f6) \
300 : ((i) == 7) ? (void *)&((event)->name.f7) \
301 : ((i) == 8) ? (void *)&((event)->name.f8) \
302 : ((i) == 9) ? (void *)&((event)->name.f9) \
303 : ((i) == 10) ? (void *)&((event)->name.f10) \
304 : ((i) == 11) ? (void *)&((event)->name.f11) \
305 : ((i) == 12) ? (void *)&((event)->name.f12) \
306 : ((i) == 13) ? (void *)&((event)->name.f13) \
307 : ((i) == 14) ? (void *)&((event)->name.f14)\
308 : NULL)
309
310#define EVENT16_FIELD_PTR(name, event, i) ( \
311 ((i) == 0) ? (void *)&((event)->name.f0) \
312 : ((i) == 1) ? (void *)&((event)->name.f1) \
313 : ((i) == 2) ? (void *)&((event)->name.f2) \
314 : ((i) == 3) ? (void *)&((event)->name.f3) \
315 : ((i) == 4) ? (void *)&((event)->name.f4) \
316 : ((i) == 5) ? (void *)&((event)->name.f5) \
317 : ((i) == 6) ? (void *)&((event)->name.f6) \
318 : ((i) == 7) ? (void *)&((event)->name.f7) \
319 : ((i) == 8) ? (void *)&((event)->name.f8) \
320 : ((i) == 9) ? (void *)&((event)->name.f9) \
321 : ((i) == 10) ? (void *)&((event)->name.f10) \
322 : ((i) == 11) ? (void *)&((event)->name.f11) \
323 : ((i) == 12) ? (void *)&((event)->name.f12) \
324 : ((i) == 13) ? (void *)&((event)->name.f13) \
325 : ((i) == 14) ? (void *)&((event)->name.f14) \
326 : ((i) == 15) ? (void *)&((event)->name.f15)\
327 : NULL)
328
329#define EVENT17_FIELD_PTR(name, event, i) ( \
330 ((i) == 0) ? (void *)&((event)->name.f0) \
331 : ((i) == 1) ? (void *)&((event)->name.f1) \
332 : ((i) == 2) ? (void *)&((event)->name.f2) \
333 : ((i) == 3) ? (void *)&((event)->name.f3) \
334 : ((i) == 4) ? (void *)&((event)->name.f4) \
335 : ((i) == 5) ? (void *)&((event)->name.f5) \
336 : ((i) == 6) ? (void *)&((event)->name.f6) \
337 : ((i) == 7) ? (void *)&((event)->name.f7) \
338 : ((i) == 8) ? (void *)&((event)->name.f8) \
339 : ((i) == 9) ? (void *)&((event)->name.f9) \
340 : ((i) == 10) ? (void *)&((event)->name.f10) \
341 : ((i) == 11) ? (void *)&((event)->name.f11) \
342 : ((i) == 12) ? (void *)&((event)->name.f12) \
343 : ((i) == 13) ? (void *)&((event)->name.f13) \
344 : ((i) == 14) ? (void *)&((event)->name.f14) \
345 : ((i) == 15) ? (void *)&((event)->name.f15) \
346 : ((i) == 16) ? (void *)&((event)->name.f16)\
347 : NULL)
348
349#define EVENT18_FIELD_PTR(name, event, i) ( \
350 ((i) == 0) ? (void *)&((event)->name.f0) \
351 : ((i) == 1) ? (void *)&((event)->name.f1) \
352 : ((i) == 2) ? (void *)&((event)->name.f2) \
353 : ((i) == 3) ? (void *)&((event)->name.f3) \
354 : ((i) == 4) ? (void *)&((event)->name.f4) \
355 : ((i) == 5) ? (void *)&((event)->name.f5) \
356 : ((i) == 6) ? (void *)&((event)->name.f6) \
357 : ((i) == 7) ? (void *)&((event)->name.f7) \
358 : ((i) == 8) ? (void *)&((event)->name.f8) \
359 : ((i) == 9) ? (void *)&((event)->name.f9) \
360 : ((i) == 10) ? (void *)&((event)->name.f10) \
361 : ((i) == 11) ? (void *)&((event)->name.f11) \
362 : ((i) == 12) ? (void *)&((event)->name.f12) \
363 : ((i) == 13) ? (void *)&((event)->name.f13) \
364 : ((i) == 14) ? (void *)&((event)->name.f14) \
365 : ((i) == 15) ? (void *)&((event)->name.f15) \
366 : ((i) == 16) ? (void *)&((event)->name.f16) \
367 : ((i) == 17) ? (void *)&((event)->name.f17)\
368 : NULL)
369
370#define EVENT19_FIELD_PTR(name, event, i) ( \
371 ((i) == 0) ? (void *)&((event)->name.f0) \
372 : ((i) == 1) ? (void *)&((event)->name.f1) \
373 : ((i) == 2) ? (void *)&((event)->name.f2) \
374 : ((i) == 3) ? (void *)&((event)->name.f3) \
375 : ((i) == 4) ? (void *)&((event)->name.f4) \
376 : ((i) == 5) ? (void *)&((event)->name.f5) \
377 : ((i) == 6) ? (void *)&((event)->name.f6) \
378 : ((i) == 7) ? (void *)&((event)->name.f7) \
379 : ((i) == 8) ? (void *)&((event)->name.f8) \
380 : ((i) == 9) ? (void *)&((event)->name.f9) \
381 : ((i) == 10) ? (void *)&((event)->name.f10) \
382 : ((i) == 11) ? (void *)&((event)->name.f11) \
383 : ((i) == 12) ? (void *)&((event)->name.f12) \
384 : ((i) == 13) ? (void *)&((event)->name.f13) \
385 : ((i) == 14) ? (void *)&((event)->name.f14) \
386 : ((i) == 15) ? (void *)&((event)->name.f15) \
387 : ((i) == 16) ? (void *)&((event)->name.f16) \
388 : ((i) == 17) ? (void *)&((event)->name.f17) \
389 : ((i) == 18) ? (void *)&((event)->name.f18)\
390 : NULL)
391#endif
392
393
394#endif /* eventcom_h */ 137#endif /* eventcom_h */
395 138
396 139