diff --git a/mps/code/event.c b/mps/code/event.c index 0b4d16353b4..c16ac133bbe 100644 --- a/mps/code/event.c +++ b/mps/code/event.c @@ -80,6 +80,9 @@ Res EventInit(void) { Res res; + /* Ensure that no event can be larger than the maximum event size. */ + AVER(EventBufferSIZE <= EventSizeMAX); + /* Only if this is the first call. */ if(!eventInited) { /* See .trans.log */ AVER(EventNext == 0); diff --git a/mps/code/event.h b/mps/code/event.h index f089560cf4d..99373c1712f 100644 --- a/mps/code/event.h +++ b/mps/code/event.h @@ -40,16 +40,17 @@ extern Res EventFlush(void); extern char *EventNext, *EventLimit; extern Word EventKindControl; -#define EVENT_BEGIN(name, size) \ +#define EVENT_BEGIN(name, structSize) \ BEGIN \ if(BS_IS_MEMBER(EventKindControl, ((Index)Event##name##Kind))) { \ Event##name##Struct *_event; \ - size_t _size = size_tAlignUp(size, MPS_PF_ALIGN); \ + size_t _size = size_tAlignUp(structSize, MPS_PF_ALIGN); \ if (_size > (size_t)(EventLimit - EventNext)) \ EventFlush(); \ AVER(_size <= (size_t)(EventLimit - EventNext)); \ _event = (void *)EventNext; \ _event->code = Event##name##Code; \ + _event->size = (EventSize)_size; \ _event->clock = mps_clock(); #define EVENT_END(name, size) \ diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h index f0f4bfdcc5f..1db05d4c0fe 100644 --- a/mps/code/eventcom.h +++ b/mps/code/eventcom.h @@ -9,6 +9,7 @@ #ifndef eventcom_h #define eventcom_h +#include #include "mpmtypes.h" /* for Word */ #include "eventdef.h" @@ -17,6 +18,8 @@ typedef unsigned short EventCode; typedef unsigned EventKind; +typedef unsigned short EventSize; +#define EventSizeMAX USHRT_MAX typedef Byte EventStringLen; @@ -80,15 +83,18 @@ typedef unsigned EventFU; typedef EventStringStruct EventFS; typedef double EventFD; -/* Common prefix for all event structures */ +/* Common prefix for all event structures. The size field allows an event + reader to skip over events whose codes it does not recognise. */ typedef struct EventAnyStruct { EventCode code; + EventSize size; Word clock; } EventAnyStruct; #define EVENT_STRUCT(X, name, _code, always, kind, count, format) \ typedef struct Event##name##Struct { \ EventCode code; \ + EventSize size; \ Word clock; \ EVENT_STRUCT_FIELDS_##count format \ } Event##name##Struct;