aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/config.h57
-rw-r--r--mps/code/event.h51
-rw-r--r--mps/code/eventcom.h2
-rw-r--r--mps/code/eventdef.h172
4 files changed, 148 insertions, 134 deletions
diff --git a/mps/code/config.h b/mps/code/config.h
index 29abad920f7..e27ee92ddca 100644
--- a/mps/code/config.h
+++ b/mps/code/config.h
@@ -286,6 +286,63 @@
286#define EventBufferSIZE ((size_t)4096) 286#define EventBufferSIZE ((size_t)4096)
287#define EventStringLengthMAX ((size_t)255) /* Not including NUL */ 287#define EventStringLengthMAX ((size_t)255) /* Not including NUL */
288 288
289/* EVENT_CLOCK -- fast event timestamp clock
290 *
291 * On platforms that support it, we want to stamp events with a very cheap
292 * and fast high-resolution timer.
293 */
294
295/* http://msdn.microsoft.com/en-US/library/twchhe95%28v=vs.100%29.aspx */
296#if (defined(MPS_ARCH_I3) || defined(MPS_ARCH_I6)) && defined(MPS_BUILD_MV)
297
298#pragma intrinsic(__rdtsc)
299typedef unsigned __int64 EventClock;
300#define EVENT_CLOCK(lvalue) \
301BEGIN \
302(lvalue) = __rdtsc(); \
303END
304
305/* http://clang.llvm.org/docs/LanguageExtensions.html#builtins */
306#elif defined(MPS_BUILD_LL)
307
308#if __has_builtin(__builtin_readcyclecounter)
309
310typedef unsigned long long EventClock;
311#define EVENT_CLOCK(lvalue) \
312 BEGIN \
313 (lvalue) = __builtin_readcyclecounter(); \
314 END
315
316#endif /* __has_builtin(__builtin_readcyclecounter) */
317
318#endif
319
320/* Assemble the rdtsc instruction */
321#if !defined(EVENT_CLOCK) && \
322 (defined(MPS_ARCH_I3) || defined(MPS_ARCH_I6)) && \
323 (defined(MPS_BUILD_GC) || defined(MPS_BUILD_LL))
324
325/* Use __extension__ to enable use of a 64-bit type on 32-bit pedantic GCC */
326__extension__ typedef unsigned long long EventClock;
327#define EVENT_CLOCK(lvalue) \
328 BEGIN \
329 unsigned _l, _h; \
330 __asm__ __volatile__("rdtsc" : "=a"(_l), "=d"(_h)); \
331 (lvalue) = ((EventClock)_h << 32) | _l; \
332 END
333
334#endif
335
336/* no fast clock, use plinth, probably from the C library */
337#ifndef EVENT_CLOCK
338
339#define EVENT_CLOCK(lvalue) \
340 BEGIN \
341 (lvalue) = mps_clock(); \
342 END
343
344#endif
345
289 346
290/* Assert Buffer */ 347/* Assert Buffer */
291 348
diff --git a/mps/code/event.h b/mps/code/event.h
index fed563f6117..131e95496c2 100644
--- a/mps/code/event.h
+++ b/mps/code/event.h
@@ -15,6 +15,7 @@
15#ifndef event_h 15#ifndef event_h
16#define event_h 16#define event_h
17 17
18#include "config.h" /* for EVENT_CLOCK */
18#include "eventcom.h" 19#include "eventcom.h"
19#include "mpm.h" 20#include "mpm.h"
20#include "eventdef.h" 21#include "eventdef.h"
@@ -38,53 +39,10 @@ extern char *EventNext, *EventLimit;
38extern Word EventKindControl; 39extern Word EventKindControl;
39 40
40 41
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
85#define EVENT_BEGIN(name, structSize) \ 42#define EVENT_BEGIN(name, structSize) \
86 BEGIN \ 43 BEGIN \
87 if(BS_IS_MEMBER(EventKindControl, ((Index)Event##name##Kind))) { \ 44 if(Event##name##Always && \
45 BS_IS_MEMBER(EventKindControl, ((Index)Event##name##Kind))) { \
88 Event##name##Struct *_event; \ 46 Event##name##Struct *_event; \
89 size_t _size = size_tAlignUp(structSize, MPS_PF_ALIGN); \ 47 size_t _size = size_tAlignUp(structSize, MPS_PF_ALIGN); \
90 if (_size > (size_t)(EventLimit - EventNext)) \ 48 if (_size > (size_t)(EventLimit - EventNext)) \
@@ -93,8 +51,7 @@ extern Word EventKindControl;
93 _event = (void *)EventNext; \ 51 _event = (void *)EventNext; \
94 _event->code = Event##name##Code; \ 52 _event->code = Event##name##Code; \
95 _event->size = (EventSize)_size; \ 53 _event->size = (EventSize)_size; \
96 { unsigned l, h; __asm__ __volatile__("rdtsc":"=a"(l),"=d"(h)); \ 54 EVENT_CLOCK(_event->clock);
97 _event->clock = ((unsigned long long)h << 32) | l; }
98 55
99#define EVENT_END(name, size) \ 56#define EVENT_END(name, size) \
100 EventNext += _size; \ 57 EventNext += _size; \
diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h
index 1871859c23a..1bf0a67c311 100644
--- a/mps/code/eventcom.h
+++ b/mps/code/eventcom.h
@@ -10,13 +10,13 @@
10#define eventcom_h 10#define eventcom_h
11 11
12#include <limits.h> 12#include <limits.h>
13#include "config.h" /* for EventClock */
13#include "mpmtypes.h" /* for Word */ 14#include "mpmtypes.h" /* for Word */
14#include "eventdef.h" 15#include "eventdef.h"
15 16
16 17
17/* Types for event fields */ 18/* Types for event fields */
18 19
19typedef unsigned long long EventClock;
20typedef unsigned short EventCode; 20typedef unsigned short EventCode;
21typedef unsigned EventKind; 21typedef unsigned EventKind;
22typedef unsigned short EventSize; 22typedef unsigned short EventSize;
diff --git a/mps/code/eventdef.h b/mps/code/eventdef.h
index 9cb66e3dbe9..aaffd6cf43d 100644
--- a/mps/code/eventdef.h
+++ b/mps/code/eventdef.h
@@ -56,103 +56,103 @@
56 56
57#define EVENT_LIST(EVENT, X) \ 57#define EVENT_LIST(EVENT, X) \
58 /* 0123456789012345678 <- don't exceed without changing EventNameMAX */ \ 58 /* 0123456789012345678 <- don't exceed without changing EventNameMAX */ \
59 EVENT(X, AMCGenCreate , 0x0001, TRUE, Pool, 2, (P,P)) \ 59 EVENT(X, AMCGenCreate , 0x0001, TRUE, Pool, 2, (P,P)) \
60 EVENT(X, AMCGenDestroy , 0x0002, TRUE, Pool, 1, (P)) \ 60 EVENT(X, AMCGenDestroy , 0x0002, TRUE, Pool, 1, (P)) \
61 EVENT(X, AMCInit , 0x0003, TRUE, Pool, 2, (P,P)) \ 61 EVENT(X, AMCInit , 0x0003, TRUE, Pool, 2, (P,P)) \
62 EVENT(X, AMCFinish , 0x0004, TRUE, Pool, 1, (P)) \ 62 EVENT(X, AMCFinish , 0x0004, TRUE, Pool, 1, (P)) \
63 EVENT(X, ArenaCreateVM , 0x0005, TRUE, Arena, 3, (P,W,W)) \ 63 EVENT(X, ArenaCreateVM , 0x0005, TRUE, Arena, 3, (P,W,W)) \
64 EVENT(X, ArenaCreateVMNZ , 0x0006, TRUE, Arena, 3, (P,W,W)) \ 64 EVENT(X, ArenaCreateVMNZ , 0x0006, TRUE, Arena, 3, (P,W,W)) \
65 EVENT(X, ArenaWriteFaults , 0x0007, TRUE, Trace, 2, (P,W)) \ 65 EVENT(X, ArenaWriteFaults , 0x0007, TRUE, Trace, 2, (P,W)) \
66 EVENT(X, MeterInit , 0x0008, TRUE, Pool, 2, (P,P)) \ 66 EVENT(X, MeterInit , 0x0008, TRUE, Pool, 2, (P,P)) \
67 EVENT(X, MeterValues , 0x0009, TRUE, Pool, 6, (P,D,D,W,W,W)) \ 67 EVENT(X, MeterValues , 0x0009, TRUE, Pool, 6, (P,D,D,W,W,W)) \
68 EVENT(X, AMCScanBegin , 0x000a, TRUE, Seg, 3, (P,P,P)) \ 68 EVENT(X, AMCScanBegin , 0x000a, TRUE, Seg, 3, (P,P,P)) \
69 EVENT(X, AMCScanEnd , 0x000b, TRUE, Seg, 3, (P,P,P)) \ 69 EVENT(X, AMCScanEnd , 0x000b, TRUE, Seg, 3, (P,P,P)) \
70 EVENT(X, AMCFix , 0x000c, TRUE, Ref, 0, ()) \ 70 EVENT(X, AMCFix , 0x000c, FALSE, Ref, 0, ()) \
71 EVENT(X, AMCFixInPlace , 0x000d, TRUE, Ref, 0, ()) \ 71 EVENT(X, AMCFixInPlace , 0x000d, FALSE, Ref, 0, ()) \
72 EVENT(X, AMCFixForward , 0x000e, TRUE, Ref, 1, (A)) \ 72 EVENT(X, AMCFixForward , 0x000e, FALSE, Ref, 1, (A)) \
73 EVENT(X, AMCReclaim , 0x000f, TRUE, Seg, 3, (P,P,P)) \ 73 EVENT(X, AMCReclaim , 0x000f, TRUE, Seg, 3, (P,P,P)) \
74 /* EVENT(X, AMCTraceEnd , 0x0010, TRUE, Trace, 3, (P,P,P)) */ \ 74 /* EVENT(X, AMCTraceEnd , 0x0010, TRUE, Trace, 3, (P,P,P)) */ \
75 EVENT(X, ArenaCreateCL , 0x0011, TRUE, Arena, 3, (P,W,A)) \ 75 EVENT(X, ArenaCreateCL , 0x0011, TRUE, Arena, 3, (P,W,A)) \
76 EVENT(X, ArenaDestroy , 0x0012, TRUE, Arena, 1, (P)) \ 76 EVENT(X, ArenaDestroy , 0x0012, TRUE, Arena, 1, (P)) \
77 EVENT(X, SegAlloc , 0x0013, TRUE, Seg, 5, (P,P,A,W,P)) \ 77 EVENT(X, SegAlloc , 0x0013, TRUE, Seg, 5, (P,P,A,W,P)) \
78 EVENT(X, SegFree , 0x0014, TRUE, Seg, 2, (P,P)) \ 78 EVENT(X, SegFree , 0x0014, TRUE, Seg, 2, (P,P)) \
79 EVENT(X, PoolInit , 0x0015, TRUE, Pool, 3, (P,P,P)) \ 79 EVENT(X, PoolInit , 0x0015, TRUE, Pool, 3, (P,P,P)) \
80 EVENT(X, PoolFinish , 0x0016, TRUE, Pool, 1, (P)) \ 80 EVENT(X, PoolFinish , 0x0016, TRUE, Pool, 1, (P)) \
81 EVENT(X, PoolAlloc , 0x0017, TRUE, Object, 3, (P,A,W)) \ 81 EVENT(X, PoolAlloc , 0x0017, TRUE, Object, 3, (P,A,W)) \
82 EVENT(X, PoolFree , 0x0018, TRUE, Object, 3, (P,A,W)) \ 82 EVENT(X, PoolFree , 0x0018, TRUE, Object, 3, (P,A,W)) \
83 EVENT(X, CBSInit , 0x0019, TRUE, Pool, 2, (P,P)) \ 83 EVENT(X, CBSInit , 0x0019, TRUE, Pool, 2, (P,P)) \
84 EVENT(X, Intern , 0x001a, TRUE, User, 2, (W,S)) \ 84 EVENT(X, Intern , 0x001a, TRUE, User, 2, (W,S)) \
85 EVENT(X, Label , 0x001b, TRUE, User, 2, (A,W)) \ 85 EVENT(X, Label , 0x001b, TRUE, User, 2, (A,W)) \
86 EVENT(X, TraceStart , 0x001c, TRUE, Trace, 3, (P,P,P)) \ 86 EVENT(X, TraceStart , 0x001c, TRUE, Trace, 3, (P,P,P)) \
87 EVENT(X, TraceCreate , 0x001d, TRUE, Trace, 4, (P,P,P,U)) \ 87 EVENT(X, TraceCreate , 0x001d, TRUE, Trace, 4, (P,P,P,U)) \
88 EVENT(X, TraceDestroy , 0x001e, TRUE, Trace, 1, (P)) \ 88 EVENT(X, TraceDestroy , 0x001e, TRUE, Trace, 1, (P)) \
89 EVENT(X, SegSetGrey , 0x001f, TRUE, Seg, 3, (P,P,U)) \ 89 EVENT(X, SegSetGrey , 0x001f, TRUE, Seg, 3, (P,P,U)) \
90 EVENT(X, TraceFlipBegin , 0x0020, TRUE, Trace, 2, (P,P)) \ 90 EVENT(X, TraceFlipBegin , 0x0020, TRUE, Trace, 2, (P,P)) \
91 EVENT(X, TraceFlipEnd , 0x0021, TRUE, Trace, 2, (P,P)) \ 91 EVENT(X, TraceFlipEnd , 0x0021, TRUE, Trace, 2, (P,P)) \
92 EVENT(X, TraceReclaim , 0x0022, TRUE, Seg, 1, (P)) \ 92 EVENT(X, TraceReclaim , 0x0022, TRUE, Seg, 1, (P)) \
93 /* EVENT(X, TraceScan , 0x0023, TRUE, Seg, 5, (U,U,P,P,P)) */ \ 93 /* EVENT(X, TraceScan , 0x0023, TRUE, Seg, 5, (U,U,P,P,P)) */ \
94 EVENT(X, TraceAccess , 0x0024, TRUE, Seg, 3, (P,P,U)) \ 94 EVENT(X, TraceAccess , 0x0024, TRUE, Seg, 3, (P,P,U)) \
95 /* TracePoll's kind isn't really Trace, but then it isn't Seg either */ \ 95 /* TracePoll's kind isn't really Trace, but then it isn't Seg either */ \
96 EVENT(X, TracePoll , 0x0025, TRUE, Trace, 2, (P,P)) \ 96 EVENT(X, TracePoll , 0x0025, TRUE, Trace, 2, (P,P)) \
97 EVENT(X, TraceFix , 0x0026, TRUE, Ref, 4, (P,P,A,U)) \ 97 EVENT(X, TraceFix , 0x0026, FALSE, Ref, 4, (P,P,A,U)) \
98 EVENT(X, TraceFixSeg , 0x0027, TRUE, Ref, 1, (P)) \ 98 EVENT(X, TraceFixSeg , 0x0027, FALSE, Ref, 1, (P)) \
99 EVENT(X, TraceFixWhite , 0x0028, TRUE, Ref, 0, ()) \ 99 EVENT(X, TraceFixWhite , 0x0028, FALSE, Ref, 0, ()) \
100 /* TraceScanArea{Tagged} abuses kind, see .kind.abuse */ \ 100 /* TraceScanArea{Tagged} abuses kind, see .kind.abuse */ \
101 EVENT(X, TraceScanArea , 0x0029, TRUE, Seg, 3, (P,P,P)) \ 101 EVENT(X, TraceScanArea , 0x0029, TRUE, Seg, 3, (P,P,P)) \
102 EVENT(X, TraceScanAreaTagged, 0x002a, TRUE, Seg, 3, (P,P,P)) \ 102 EVENT(X, TraceScanAreaTagged, 0x002a, TRUE, Seg, 3, (P,P,P)) \
103 EVENT(X, VMCreate , 0x002b, TRUE, Arena, 3, (P,A,A)) \ 103 EVENT(X, VMCreate , 0x002b, TRUE, Arena, 3, (P,A,A)) \
104 EVENT(X, VMDestroy , 0x002c, TRUE, Arena, 1, (P)) \ 104 EVENT(X, VMDestroy , 0x002c, TRUE, Arena, 1, (P)) \
105 EVENT(X, VMMap , 0x002d, TRUE, Seg, 3, (P,A,A)) \ 105 EVENT(X, VMMap , 0x002d, TRUE, Seg, 3, (P,A,A)) \
106 EVENT(X, VMUnmap , 0x002e, TRUE, Seg, 3, (P,A,A)) \ 106 EVENT(X, VMUnmap , 0x002e, TRUE, Seg, 3, (P,A,A)) \
107 EVENT(X, ArenaExtend , 0x002f, TRUE, Arena, 3, (P,A,W)) \ 107 EVENT(X, ArenaExtend , 0x002f, TRUE, Arena, 3, (P,A,W)) \
108 EVENT(X, ArenaRetract , 0x0030, TRUE, Arena, 3, (P,A,W)) \ 108 EVENT(X, ArenaRetract , 0x0030, TRUE, Arena, 3, (P,A,W)) \
109 EVENT(X, TraceSegGreyen , 0x0031, TRUE, Seg, 3, (P,P,U)) \ 109 EVENT(X, TraceSegGreyen , 0x0031, TRUE, Seg, 3, (P,P,U)) \
110 /* RootScanned abuses kind, see .kind.abuse */ \ 110 /* RootScanned abuses kind, see .kind.abuse */ \
111 EVENT(X, RootScan , 0x0032, TRUE, Seg, 3, (P,W,W)) \ 111 EVENT(X, RootScan , 0x0032, TRUE, Seg, 3, (P,W,W)) \
112 /* TraceStep abuses kind, see .kind.abuse */ \ 112 /* TraceStep abuses kind, see .kind.abuse */ \
113 EVENT(X, TraceStep , 0x0033, TRUE, Seg, 2, (P,P)) \ 113 EVENT(X, TraceStep , 0x0033, TRUE, Seg, 2, (P,P)) \
114 EVENT(X, BufferReserve , 0x0034, TRUE, Object, 3, (P,A,W)) \ 114 EVENT(X, BufferReserve , 0x0034, TRUE, Object, 3, (P,A,W)) \
115 EVENT(X, BufferCommit , 0x0035, TRUE, Object, 4, (P,A,W,A)) \ 115 EVENT(X, BufferCommit , 0x0035, TRUE, Object, 4, (P,A,W,A)) \
116 /* BufferInit/Finish abuse kind, see .kind.abuse */ \ 116 /* BufferInit/Finish abuse kind, see .kind.abuse */ \
117 EVENT(X, BufferInit , 0x0036, TRUE, Pool, 3, (P,P,U)) \ 117 EVENT(X, BufferInit , 0x0036, TRUE, Pool, 3, (P,P,U)) \
118 EVENT(X, BufferFinish , 0x0037, TRUE, Pool, 1, (P)) \ 118 EVENT(X, BufferFinish , 0x0037, TRUE, Pool, 1, (P)) \
119 /* EVENT(X, MVTFinish , 0x0038, TRUE, Pool, 1, (P)) */ \ 119 /* EVENT(X, MVTFinish , 0x0038, TRUE, Pool, 1, (P)) */ \
120 EVENT(X, BufferFill , 0x0039, TRUE, Seg, 4, (P,W,A,W)) \ 120 EVENT(X, BufferFill , 0x0039, TRUE, Seg, 4, (P,W,A,W)) \
121 EVENT(X, BufferEmpty , 0x003A, TRUE, Seg, 2, (P,W)) \ 121 EVENT(X, BufferEmpty , 0x003A, TRUE, Seg, 2, (P,W)) \
122 EVENT(X, SegAllocFail , 0x003B, TRUE, Seg, 3, (P,W,P)) \ 122 EVENT(X, SegAllocFail , 0x003B, TRUE, Seg, 3, (P,W,P)) \
123 EVENT(X, TraceScanSeg , 0x003C, TRUE, Seg, 4, (U,U,P,P)) \ 123 EVENT(X, TraceScanSeg , 0x003C, TRUE, Seg, 4, (U,U,P,P)) \
124 /* TraceScanSingleRef abuses kind, see .kind.abuse */ \ 124 /* TraceScanSingleRef abuses kind, see .kind.abuse */ \
125 EVENT(X, TraceScanSingleRef , 0x003D, TRUE, Seg, 4, (U,U,P,A)) \ 125 EVENT(X, TraceScanSingleRef , 0x003D, TRUE, Seg, 4, (U,U,P,A)) \
126 EVENT(X, TraceStatCondemn , 0x003E, TRUE, Trace, 7, (P,W,W,W,W,D,D)) \ 126 EVENT(X, TraceStatCondemn , 0x003E, TRUE, Trace, 7, (P,W,W,W,W,D,D)) \
127 EVENT(X, TraceStatScan , 0x003F, TRUE, Trace, 13, (P,W,W,W,W,W,W,W,W,W,W,W,W)) \ 127 EVENT(X, TraceStatScan , 0x003F, TRUE, Trace, 13, (P,W,W,W,W,W,W,W,W,W,W,W,W)) \
128 EVENT(X, TraceStatFix , 0x0040, TRUE, Trace, 10, (P,W,W,W,W,W,W,W,W,W)) \ 128 EVENT(X, TraceStatFix , 0x0040, TRUE, Trace, 10, (P,W,W,W,W,W,W,W,W,W)) \
129 EVENT(X, TraceStatReclaim , 0x0041, TRUE, Trace, 3, (P,W,W)) \ 129 EVENT(X, TraceStatReclaim , 0x0041, TRUE, Trace, 3, (P,W,W)) \
130 EVENT(X, PoolInitMVFF , 0x0042, TRUE, Pool, 8, (P,P,W,W,W,U,U,U)) \ 130 EVENT(X, PoolInitMVFF , 0x0042, TRUE, Pool, 8, (P,P,W,W,W,U,U,U)) \
131 EVENT(X, PoolInitMV , 0x0043, TRUE, Pool, 5, (P,P,W,W,W)) \ 131 EVENT(X, PoolInitMV , 0x0043, TRUE, Pool, 5, (P,P,W,W,W)) \
132 EVENT(X, PoolInitMFS , 0x0044, TRUE, Pool, 4, (P,P,W,W)) \ 132 EVENT(X, PoolInitMFS , 0x0044, TRUE, Pool, 4, (P,P,W,W)) \
133 EVENT(X, PoolInitEPVM , 0x0045, TRUE, Pool, 5, (P,P,P,U,U)) \ 133 EVENT(X, PoolInitEPVM , 0x0045, TRUE, Pool, 5, (P,P,P,U,U)) \
134 EVENT(X, PoolInitEPDL , 0x0046, TRUE, Pool, 6, (P,P,U,W,W,W)) \ 134 EVENT(X, PoolInitEPDL , 0x0046, TRUE, Pool, 6, (P,P,U,W,W,W)) \
135 EVENT(X, PoolInitAMS , 0x0047, TRUE, Pool, 3, (P,P,P)) \ 135 EVENT(X, PoolInitAMS , 0x0047, TRUE, Pool, 3, (P,P,P)) \
136 EVENT(X, PoolInitAMC , 0x0048, TRUE, Pool, 2, (P,P)) \ 136 EVENT(X, PoolInitAMC , 0x0048, TRUE, Pool, 2, (P,P)) \
137 EVENT(X, PoolInitAMCZ , 0x0049, TRUE, Pool, 2, (P,P)) \ 137 EVENT(X, PoolInitAMCZ , 0x0049, TRUE, Pool, 2, (P,P)) \
138 EVENT(X, PoolInitAWL , 0x004A, TRUE, Pool, 2, (P,P)) \ 138 EVENT(X, PoolInitAWL , 0x004A, TRUE, Pool, 2, (P,P)) \
139 EVENT(X, PoolInitLO , 0x004B, TRUE, Pool, 2, (P,P)) \ 139 EVENT(X, PoolInitLO , 0x004B, TRUE, Pool, 2, (P,P)) \
140 EVENT(X, PoolInitSNC , 0x004C, TRUE, Pool, 2, (P,P)) \ 140 EVENT(X, PoolInitSNC , 0x004C, TRUE, Pool, 2, (P,P)) \
141 EVENT(X, PoolInitMVT , 0x004D, TRUE, Pool, 6, (P,W,W,W,W,W)) \ 141 EVENT(X, PoolInitMVT , 0x004D, TRUE, Pool, 6, (P,W,W,W,W,W)) \
142 EVENT(X, BufferInitEPVM , 0x0050, TRUE, Pool, 3, (P,P,U)) \ 142 EVENT(X, BufferInitEPVM , 0x0050, TRUE, Pool, 3, (P,P,U)) \
143 EVENT(X, BufferInitSeg , 0x0051, TRUE, Pool, 3, (P,P,U)) \ 143 EVENT(X, BufferInitSeg , 0x0051, TRUE, Pool, 3, (P,P,U)) \
144 EVENT(X, BufferInitRank , 0x0052, TRUE, Pool, 4, (P,P,U,U)) \ 144 EVENT(X, BufferInitRank , 0x0052, TRUE, Pool, 4, (P,P,U,U)) \
145 /* PoolPush/Pop go under Object, because they're user ops. */ \ 145 /* PoolPush/Pop go under Object, because they're user ops. */ \
146 EVENT(X, PoolPush , 0x0060, TRUE, Object, 1, (P)) \ 146 EVENT(X, PoolPush , 0x0060, TRUE, Object, 1, (P)) \
147 EVENT(X, PoolPop , 0x0061, TRUE, Object, 2, (P,U)) \ 147 EVENT(X, PoolPop , 0x0061, TRUE, Object, 2, (P,U)) \
148 EVENT(X, ReservoirLimitSet , 0x0062, TRUE, Arena, 2, (P,W)) \ 148 EVENT(X, ReservoirLimitSet , 0x0062, TRUE, Arena, 2, (P,W)) \
149 EVENT(X, CommitLimitSet , 0x0063, TRUE, Arena, 3, (P,W,U)) \ 149 EVENT(X, CommitLimitSet , 0x0063, TRUE, Arena, 3, (P,W,U)) \
150 EVENT(X, SpareCommitLimitSet, 0x0064, TRUE, Arena, 2, (P,W)) \ 150 EVENT(X, SpareCommitLimitSet, 0x0064, TRUE, Arena, 2, (P,W)) \
151 EVENT(X, ArenaAlloc , 0x0065, TRUE, Arena, 5, (P,P,A,W,P)) \ 151 EVENT(X, ArenaAlloc , 0x0065, TRUE, Arena, 5, (P,P,A,W,P)) \
152 EVENT(X, ArenaFree , 0x0066, TRUE, Arena, 3, (P,A,W)) \ 152 EVENT(X, ArenaFree , 0x0066, TRUE, Arena, 3, (P,A,W)) \
153 EVENT(X, ArenaAllocFail , 0x0067, TRUE, Arena, 3, (P,W,P)) \ 153 EVENT(X, ArenaAllocFail , 0x0067, TRUE, Arena, 3, (P,W,P)) \
154 EVENT(X, SegMerge , 0x0068, TRUE, Seg, 3, (P,P,P)) \ 154 EVENT(X, SegMerge , 0x0068, TRUE, Seg, 3, (P,P,P)) \
155 EVENT(X, SegSplit , 0x0069, TRUE, Seg, 4, (P,P,P,A)) 155 EVENT(X, SegSplit , 0x0069, TRUE, Seg, 4, (P,P,P,A))
156 156
157/* Remember to update EventNameMAX and EventCodeMAX in eventcom.h! */ 157/* Remember to update EventNameMAX and EventCodeMAX in eventcom.h! */
158 158