Protect checking clock state with a mutex to prevent deadlock condition
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@550 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
Changes towards version 0.2:
|
Changes towards version 0.2:
|
||||||
|
- Fixed a potential semaphore race when suspending clock -PhracturedBlue
|
||||||
- Function name conflict fixes for Mac OSX -by peterb
|
- Function name conflict fixes for Mac OSX -by peterb
|
||||||
- Minor fixes for pc-fonts (Outfit screen, gradient color swap) -by Nic
|
- Minor fixes for pc-fonts (Outfit screen, gradient color swap) -by Nic
|
||||||
- DCQ is now accessed uniformly by routines in gfx_common.c
|
- DCQ is now accessed uniformly by routines in gfx_common.c
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
#define IsLeapYear(yi) (!((yi) & 3) && (((yi) % 100) || ((yi) % 400)))
|
#define IsLeapYear(yi) (!((yi) & 3) && (((yi) % 100) || ((yi) % 400)))
|
||||||
|
|
||||||
|
static Mutex clock_mutex;
|
||||||
|
|
||||||
int clock_task_func(void* data)
|
int clock_task_func(void* data)
|
||||||
{
|
{
|
||||||
BOOLEAN LastPilot;
|
BOOLEAN LastPilot;
|
||||||
@@ -170,7 +172,7 @@ InitGameClock (void)
|
|||||||
{
|
{
|
||||||
if (!InitQueue (&GLOBAL (GameClock.event_q), NUM_EVENTS, sizeof (EVENT)))
|
if (!InitQueue (&GLOBAL (GameClock.event_q), NUM_EVENTS, sizeof (EVENT)))
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
clock_mutex = CreateMutex ();
|
||||||
GLOBAL (GameClock.month_index) = 2;
|
GLOBAL (GameClock.month_index) = 2;
|
||||||
GLOBAL (GameClock.day_index) = 17;
|
GLOBAL (GameClock.day_index) = 17;
|
||||||
GLOBAL (GameClock.year_index) = START_YEAR; /* Feb 17, START_YEAR */
|
GLOBAL (GameClock.year_index) = START_YEAR; /* Feb 17, START_YEAR */
|
||||||
@@ -189,13 +191,13 @@ UninitGameClock (void)
|
|||||||
{
|
{
|
||||||
if (GLOBAL (GameClock.clock_task))
|
if (GLOBAL (GameClock.clock_task))
|
||||||
{
|
{
|
||||||
if (!GameClockRunning ())
|
ResumeGameClock ();
|
||||||
ResumeGameClock ();
|
|
||||||
|
|
||||||
ConcludeTask (GLOBAL (GameClock.clock_task));
|
ConcludeTask (GLOBAL (GameClock.clock_task));
|
||||||
|
|
||||||
GLOBAL (GameClock.clock_task) = 0;
|
GLOBAL (GameClock.clock_task) = 0;
|
||||||
}
|
}
|
||||||
|
DestroyMutex (clock_mutex);
|
||||||
|
|
||||||
UninitQueue (&GLOBAL (GameClock.event_q));
|
UninitQueue (&GLOBAL (GameClock.event_q));
|
||||||
|
|
||||||
@@ -205,21 +207,25 @@ UninitGameClock (void)
|
|||||||
void
|
void
|
||||||
SuspendGameClock (void)
|
SuspendGameClock (void)
|
||||||
{
|
{
|
||||||
|
LockMutex (clock_mutex);
|
||||||
if (GameClockRunning ())
|
if (GameClockRunning ())
|
||||||
{
|
{
|
||||||
SetSemaphore (GLOBAL (GameClock.clock_sem));
|
SetSemaphore (GLOBAL (GameClock.clock_sem));
|
||||||
GLOBAL (GameClock.TimeCounter) = 0;
|
GLOBAL (GameClock.TimeCounter) = 0;
|
||||||
}
|
}
|
||||||
|
UnlockMutex (clock_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ResumeGameClock (void)
|
ResumeGameClock (void)
|
||||||
{
|
{
|
||||||
|
LockMutex (clock_mutex);
|
||||||
if (!GameClockRunning ())
|
if (!GameClockRunning ())
|
||||||
{
|
{
|
||||||
GLOBAL (GameClock.TimeCounter) = GetTimeCounter ();
|
GLOBAL (GameClock.TimeCounter) = GetTimeCounter ();
|
||||||
ClearSemaphore (GLOBAL (GameClock.clock_sem));
|
ClearSemaphore (GLOBAL (GameClock.clock_sem));
|
||||||
}
|
}
|
||||||
|
UnlockMutex (clock_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
|||||||
@@ -30,11 +30,8 @@ INPUT_STATE
|
|||||||
ConfirmExit (void)
|
ConfirmExit (void)
|
||||||
{
|
{
|
||||||
INPUT_STATE InputState;
|
INPUT_STATE InputState;
|
||||||
BOOLEAN ClockActive;
|
|
||||||
|
|
||||||
ClockActive = (BOOLEAN)(LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE
|
if (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
|
||||||
&& GameClockRunning ());
|
|
||||||
if (ClockActive)
|
|
||||||
SuspendGameClock ();
|
SuspendGameClock ();
|
||||||
else if (CommData.ConversationPhrases && PlayingTrack ())
|
else if (CommData.ConversationPhrases && PlayingTrack ())
|
||||||
PauseTrack ();
|
PauseTrack ();
|
||||||
@@ -105,7 +102,7 @@ ConfirmExit (void)
|
|||||||
}
|
}
|
||||||
ClearSemaphore (GraphicsSem);
|
ClearSemaphore (GraphicsSem);
|
||||||
|
|
||||||
if (ClockActive)
|
if (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
|
||||||
ResumeGameClock ();
|
ResumeGameClock ();
|
||||||
else if (CommData.ConversationPhrases && PlayingTrack ())
|
else if (CommData.ConversationPhrases && PlayingTrack ())
|
||||||
ResumeTrack ();
|
ResumeTrack ();
|
||||||
|
|||||||
@@ -362,8 +362,7 @@ BOOLEAN
|
|||||||
FreeHyperspace (void)
|
FreeHyperspace (void)
|
||||||
{
|
{
|
||||||
ClearSemaphore (GraphicsSem);
|
ClearSemaphore (GraphicsSem);
|
||||||
if (GameClockRunning ())
|
SuspendGameClock ();
|
||||||
SuspendGameClock ();
|
|
||||||
SetSemaphore (GraphicsSem);
|
SetSemaphore (GraphicsSem);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -902,8 +902,7 @@ extern COUNT _simple_count;
|
|||||||
|
|
||||||
sc = _simple_count;
|
sc = _simple_count;
|
||||||
#endif //TESTING
|
#endif //TESTING
|
||||||
if (GameClockRunning ())
|
SuspendGameClock ();
|
||||||
SuspendGameClock ();
|
|
||||||
|
|
||||||
if (!((GLOBAL (CurrentActivity) | NextActivity) & CHECK_LOAD))
|
if (!((GLOBAL (CurrentActivity) | NextActivity) & CHECK_LOAD))
|
||||||
ZeroVelocityComponents (
|
ZeroVelocityComponents (
|
||||||
|
|||||||
@@ -141,7 +141,6 @@ PauseGame (void)
|
|||||||
{
|
{
|
||||||
RECT r;
|
RECT r;
|
||||||
STAMP s;
|
STAMP s;
|
||||||
BOOLEAN ClockActive;
|
|
||||||
CONTEXT OldContext;
|
CONTEXT OldContext;
|
||||||
FRAME F;
|
FRAME F;
|
||||||
HOT_SPOT OldHot;
|
HOT_SPOT OldHot;
|
||||||
@@ -153,11 +152,7 @@ PauseGame (void)
|
|||||||
|
|
||||||
GLOBAL (CurrentActivity) |= CHECK_PAUSE;
|
GLOBAL (CurrentActivity) |= CHECK_PAUSE;
|
||||||
|
|
||||||
ClockActive = (BOOLEAN)(
|
if (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
|
||||||
LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE
|
|
||||||
&& GameClockRunning ()
|
|
||||||
);
|
|
||||||
if (ClockActive)
|
|
||||||
SuspendGameClock ();
|
SuspendGameClock ();
|
||||||
else if (CommData.ConversationPhrases && PlayingTrack ())
|
else if (CommData.ConversationPhrases && PlayingTrack ())
|
||||||
PauseTrack ();
|
PauseTrack ();
|
||||||
@@ -201,7 +196,7 @@ PauseGame (void)
|
|||||||
FlushInput ();
|
FlushInput ();
|
||||||
ClearSemaphore (GraphicsSem);
|
ClearSemaphore (GraphicsSem);
|
||||||
|
|
||||||
if (ClockActive)
|
if (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
|
||||||
ResumeGameClock ();
|
ResumeGameClock ();
|
||||||
else if (CommData.ConversationPhrases && PlayingTrack ())
|
else if (CommData.ConversationPhrases && PlayingTrack ())
|
||||||
ResumeTrack ();
|
ResumeTrack ();
|
||||||
|
|||||||
Reference in New Issue
Block a user