From 76ab2591ef672a5bbd3e18582373a0ca8359ad71 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Wed, 22 Aug 2012 09:16:03 +0100 Subject: [PATCH] Adding a size field to events so that a reader can skip unknown event codes (unimplemented). Copied from Perforce Change: 179019 ServerID: perforce.ravenbrook.com --- mps/code/event.c | 3 +++ mps/code/event.h | 5 +++-- mps/code/eventcom.h | 8 +++++++- 3 files changed, 13 insertions(+), 3 deletions(-) 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;