diff --git a/mps/code/event.c b/mps/code/event.c index d4b32f83a2c..0b4d16353b4 100644 --- a/mps/code/event.c +++ b/mps/code/event.c @@ -46,11 +46,15 @@ Word EventKindControl; /* Bit set used to control output. */ Res EventFlush(void) { Res res; + size_t size; AVER(eventInited); - res = (Res)mps_io_write(eventIO, (void *)eventBuffer, - EventNext - eventBuffer); + AVER(eventBuffer <= EventNext); + AVER(EventNext <= eventBuffer + EventBufferSIZE); + size = (size_t)(EventNext - eventBuffer); + + res = (Res)mps_io_write(eventIO, (void *)eventBuffer, size); EventNext = eventBuffer; if (res != ResOK) return res; diff --git a/mps/code/event.h b/mps/code/event.h index 139460955fa..97e622b628d 100644 --- a/mps/code/event.h +++ b/mps/code/event.h @@ -35,43 +35,8 @@ extern void EventLabelAddr(Addr, Word); extern Res EventFlush(void); -/* Event Kinds --- see - * - * All events are classified as being of one event type. - * They are small enough to be able to be used as shifts within a word. - */ - -#define EventKindArena ((EventKind)0) /* Per space or arena */ -#define EventKindPool ((EventKind)1) /* Per pool */ -#define EventKindTrace ((EventKind)2) /* Per trace or scan */ -#define EventKindSeg ((EventKind)3) /* Per seg */ -#define EventKindRef ((EventKind)4) /* Per ref or fix */ -#define EventKindObject ((EventKind)5) /* Per alloc or object */ -#define EventKindUser ((EventKind)6) /* User-invoked */ - -#define EventKindNumber ((Count)7) /* Number of event kinds */ - - -/* Event type definitions - * - * Define various constants for each event type to describe them. - */ - -/* Note that enum values can be up to fifteen bits long portably. */ -#define EVENT_ENUM(X, type, code, always, kind, count, format) \ - enum { \ - Event##type##High = ((code >> 8) & 0xFF), \ - Event##type##Low = (code & 0xFF), \ - Event##type##Always = always, \ - Event##type##Kind = EventKind##kind \ - }; - -EVENT_LIST(EVENT_ENUM, X) - - /* Event writing support */ -/* extern EventUnion EventMould; */ extern char *EventNext, *EventLimit; extern Word EventKindControl; diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h index 7d372cdd47a..18bef8ec4ca 100644 --- a/mps/code/eventcom.h +++ b/mps/code/eventcom.h @@ -16,8 +16,8 @@ /* Types for event fields */ typedef Word EventType; -typedef size_t EventCode; -typedef Index EventKind; +typedef unsigned short EventCode; +typedef unsigned EventKind; typedef Byte EventStringLen; @@ -33,6 +33,39 @@ typedef EventStringStruct *EventString; #define EventCodeMAX ((EventCode)0x0069) +/* Event Kinds --- see + * + * All events are classified as being of one event type. + * They are small enough to be able to be used as shifts within a word. + */ + +enum { + EventKindArena, /* Per space or arena */ + EventKindPool, /* Per pool */ + EventKindTrace, /* Per trace or scan */ + EventKindSeg, /* Per seg */ + EventKindRef, /* Per ref or fix */ + EventKindObject, /* Per alloc or object */ + EventKindUser, /* User-invoked */ + EventKindLIMIT +}; + + +/* Event type definitions + * + * Define various constants for each event type to describe them. + */ + +/* Note that enum values can be up to fifteen bits long portably. */ +#define EVENT_ENUM(X, name, code, always, kind, count, format) \ + enum { \ + Event##name##Always = always, \ + Event##name##Kind = EventKind##kind \ + }; + +EVENT_LIST(EVENT_ENUM, X) + + /* Event*Struct -- Event Structures * * Declare the structures that are used to encode events in the internal event @@ -112,11 +145,11 @@ typedef union EventUnion { BEGIN \ size_t _string_len = (length); \ size_t size; \ - AVER(_string_len < EventStringLengthMAX); \ size = offsetof(Event##name##Struct, f1.str) + _string_len; \ EVENT_BEGIN(name, size) \ _event->f0 = (p0); \ - _event->f1.len = _string_len; \ + AVER(_string_len < EventStringLengthMAX); \ + _event->f1.len = (EventStringLen)_string_len; \ mps_lib_memcpy(_event->f1.str, (string), _string_len); \ EVENT_END(name, size); \ END @@ -141,7 +174,6 @@ typedef union EventUnion { #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)) - #define EVENT0_FIELD_PTR(name, event, i) NULL /* diff --git a/mps/code/eventpro.c b/mps/code/eventpro.c index 07faea3226e..e66c76a69a9 100644 --- a/mps/code/eventpro.c +++ b/mps/code/eventpro.c @@ -72,7 +72,7 @@ struct EventProcStruct { typedef struct { EventType type; char *name; - size_t code; + EventCode code; size_t length; char *format; } eventRecord;