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:
ghaushe
2003-01-13 04:42:25 +00:00
parent c8ffcd9aa2
commit 654b62a865
6 changed files with 16 additions and 19 deletions
+1
View File
@@ -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
+9 -3
View File
@@ -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
+2 -5
View File
@@ -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 ();
+1 -2
View File
@@ -362,8 +362,7 @@ BOOLEAN
FreeHyperspace (void) FreeHyperspace (void)
{ {
ClearSemaphore (GraphicsSem); ClearSemaphore (GraphicsSem);
if (GameClockRunning ()) SuspendGameClock ();
SuspendGameClock ();
SetSemaphore (GraphicsSem); SetSemaphore (GraphicsSem);
{ {
+1 -2
View File
@@ -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 (
+2 -7
View File
@@ -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 ();