From 11268b74a11fa739f17593358d5262dab7f23ca8 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 17 Mar 2003 01:02:04 +0000 Subject: [PATCH] make some explicit guarantees about message delivery order --- stepmania/src/Screen.cpp | 14 ++++++++++++++ stepmania/src/Screen.h | 1 + 2 files changed, 15 insertions(+) diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index 8909b9cdec..a666ce81d4 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -37,10 +37,24 @@ void Screen::AddChild( Actor* pActor ) ActorFrame::AddChild( pActor ); } +bool Screen::SortMessagesByDelayRemaining(const Screen::QueuedScreenMessage &m1, + const Screen::QueuedScreenMessage &m2) +{ + return m1.fDelayRemaining < m2.fDelayRemaining; +} + void Screen::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); + /* We need to ensure two things: + * 1. Messages must be sent in the order of delay. If two messages are sent + * simultaneously, one with a .001 delay and another with a .002 delay, the + * .001 delay message must be sent first. + * 2. Messages to be delivered simultaneously must be sent in the order queued. + * + * Stable sort by time to ensure #2. */ + stable_sort(m_QueuedMessages.begin(), m_QueuedMessages.end(), SortMessagesByDelayRemaining); // update the times of queued ScreenMessages and send if timer has expired // The order you remove messages in must be very careful! Sending a message can diff --git a/stepmania/src/Screen.h b/stepmania/src/Screen.h index 213ace9cca..0531d0adc7 100644 --- a/stepmania/src/Screen.h +++ b/stepmania/src/Screen.h @@ -52,6 +52,7 @@ protected: float fDelayRemaining; }; vector m_QueuedMessages; + static bool SortMessagesByDelayRemaining(const QueuedScreenMessage &m1, const QueuedScreenMessage &m2); bool m_bIsTransparent; // screens below us need to be drawn first