diff --git a/mps/code/message.c b/mps/code/message.c index 284e78c6314..ae7ba930616 100644 --- a/mps/code/message.c +++ b/mps/code/message.c @@ -284,6 +284,14 @@ MessageClass MessageGetClass(Message message) return message->class; } +/* Return the class of a message */ +mps_clock_t MessageGetClock(Message message) +{ + AVERT(Message, message); + + return message->postedClock; +} + static void MessageDelete(Message message) { AVERT(Message, message); diff --git a/mps/code/mpm.h b/mps/code/mpm.h index b9d8e7548c1..1dfa7dc2c6a 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h @@ -311,6 +311,7 @@ extern void MessageDiscard(Arena arena, Message message); /* -- Message Methods, Generic */ extern MessageType MessageGetType(Message message); extern MessageClass MessageGetClass(Message message); +extern mps_clock_t MessageGetClock(Message message); /* -- Message Method Dispatchers, Type-specific */ extern void MessageFinalizationRef(Ref *refReturn, Arena arena, Message message); diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h index 739c95a449d..1905e2bb560 100644 --- a/mps/code/mpmst.h +++ b/mps/code/mpmst.h @@ -223,6 +223,7 @@ typedef struct MessageStruct { MessageType type; /* Message Type */ MessageClass class; /* Message Class Structure */ RingStruct queueRing; /* Message queue ring */ + mps_clock_t postedClock; /* mps_clock() at post time */ } MessageStruct; diff --git a/mps/code/mps.h b/mps/code/mps.h index e47b88077c2..2852416bac8 100644 --- a/mps/code/mps.h +++ b/mps/code/mps.h @@ -48,6 +48,7 @@ typedef size_t mps_align_t; /* alignment (size_t) */ typedef unsigned mps_rm_t; /* root mode (unsigned) */ typedef unsigned mps_rank_t; /* ranks (unsigned) */ typedef unsigned mps_message_type_t; /* message type (unsigned) */ +typedef unsigned long mps_clock_t; /* processor time */ /* Result Codes */ /* .result-codes: Keep in sync with */ @@ -527,6 +528,7 @@ extern void mps_message_discard(mps_arena_t, mps_message_t); /* -- All Message Types */ extern mps_message_type_t mps_message_type(mps_arena_t, mps_message_t); +extern mps_clock_t mps_message_clock(mps_arena_t, mps_message_t); /* -- mps_message_type_finalization */ extern void mps_message_finalization_ref(mps_addr_t *, diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index 2dbc5cfe663..e5f88fc8541 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c @@ -1675,6 +1675,23 @@ mps_message_type_t mps_message_type(mps_arena_t mps_arena, return (mps_message_type_t)type; } +mps_clock_t mps_message_clock(mps_arena_t mps_arena, + mps_message_t mps_message) +{ + Arena arena = (Arena)mps_arena; + Message message = (Message)mps_message; + mps_clock_t postedClock; /* @@@@ should be Clock, not mps_clock_t */ + + ArenaEnter(arena); + + postedClock = MessageGetClock(message); + + ArenaLeave(arena); + + return (mps_clock_t)postedClock; +} + + /* -- mps_message_type_finalization */ void mps_message_finalization_ref(mps_addr_t *mps_addr_return, diff --git a/mps/code/mpslib.h b/mps/code/mpslib.h index 094975b3cf7..f74bd986fa6 100644 --- a/mps/code/mpslib.h +++ b/mps/code/mpslib.h @@ -14,7 +14,7 @@ #define mpslib_h #include - +#include "mps.h" /* mps_clock_t */ extern int mps_lib_get_EOF(void); #define mps_lib_EOF (mps_lib_get_EOF()) @@ -36,7 +36,6 @@ extern void *(mps_lib_memcpy)(void *, const void *, size_t); extern int (mps_lib_memcmp)(const void *, const void *, size_t); -typedef unsigned long mps_clock_t; extern mps_clock_t mps_clock(void); extern mps_clock_t mps_clocks_per_sec(void);