diff --git a/sc2/ChangeLog b/sc2/ChangeLog index c9b9eb054..a351c8d3f 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,7 @@ Changes towards version 0.4: +- Introduced a new synchronization construct (CrossThreadMutex) and + migrated the GraphicsSem and clock_sem over to it (#359) -Michael +- Replaced thread-local Semaphores with Mutexes (#359) -Michael - Load/save icons don't flash anymore when in savegame menu (part of bug #291), from Paxtez - Savegame slot now defaults to the last one used during one execution diff --git a/sc2/src/sc2code/battle.c b/sc2/src/sc2code/battle.c index 97737bd28..3b7caa378 100644 --- a/sc2/src/sc2code/battle.c +++ b/sc2/src/sc2code/battle.c @@ -163,7 +163,7 @@ Battle (void) extern SIZE InitShips (void); void UninitShips (void); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetResourceIndex (hResIndex); @@ -222,7 +222,7 @@ Battle (void) ScreenTransition (3, &r); } UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (nth_frame) TaskSwitch (); else @@ -231,7 +231,7 @@ Battle (void) NextTime = GetTimeCounter (); } ProcessInput (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } while (GLOBAL (CurrentActivity) & IN_BATTLE); AbortBattle: @@ -242,7 +242,7 @@ AbortBattle: UninitShips (); FreeBattleSong (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (num_ships < 0); } diff --git a/sc2/src/sc2code/border.c b/sc2/src/sc2code/border.c index c3a0ce969..7b352ceb7 100644 --- a/sc2/src/sc2code/border.c +++ b/sc2/src/sc2code/border.c @@ -40,7 +40,7 @@ DrawSISFrame (void) { RECT r; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); BatchGraphics (); @@ -186,6 +186,6 @@ DrawSISFrame (void) ClearSISRect (DRAW_SIS_DISPLAY); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } diff --git a/sc2/src/sc2code/build.c b/sc2/src/sc2code/build.c index 031201377..7e3226d75 100644 --- a/sc2/src/sc2code/build.c +++ b/sc2/src/sc2code/build.c @@ -205,10 +205,10 @@ ActivateStarShip (COUNT which_ship, SIZE state) if (ShipRemoved) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (UNDEFINED_DELTA, UNDEFINED_DELTA, UNDEFINED_DELTA); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } @@ -293,10 +293,10 @@ ActivateStarShip (COUNT which_ship, SIZE state) ); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (UNDEFINED_DELTA, UNDEFINED_DELTA, UNDEFINED_DELTA); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (i); } break; diff --git a/sc2/src/sc2code/clock.c b/sc2/src/sc2code/clock.c index 7fdbbc5ce..b49f3f65b 100644 --- a/sc2/src/sc2code/clock.c +++ b/sc2/src/sc2code/clock.c @@ -65,7 +65,7 @@ int clock_task_func(void* data) * can be halted. (e.g. during battle * or communications) */ - SetSemaphore (GLOBAL (GameClock.clock_sem)); + LockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); TimeIn = GetTimeCounter (); if (GLOBAL (GameClock).tick_count <= 0 @@ -89,7 +89,7 @@ int clock_task_func(void* data) } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (NULL_PTR); { HEVENT hEvent; @@ -114,7 +114,7 @@ int clock_task_func(void* data) FreeEvent (hEvent); } } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } OnAutoPilot = (BOOLEAN)( @@ -126,7 +126,7 @@ int clock_task_func(void* data) { DWORD num_ticks; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); num_ticks = GetTimeCounter () - LastTime; if (!OnAutoPilot) { @@ -159,13 +159,13 @@ int clock_task_func(void* data) cycle_index = (cycle_index + 1) % NUM_CYCLES; delay_count = NUM_DELAYS; } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); LastPilot = OnAutoPilot; LastTime += num_ticks; } - ClearSemaphore (GLOBAL (GameClock.clock_sem)); + UnlockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); SleepThreadUntil (TimeIn + ONE_SECOND / 120); } FinishTask (task); @@ -215,7 +215,7 @@ SuspendGameClock (void) LockMutex (clock_mutex); if (GameClockRunning ()) { - SetSemaphore (GLOBAL (GameClock.clock_sem)); + LockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); GLOBAL (GameClock.TimeCounter) = 0; } UnlockMutex (clock_mutex); @@ -228,7 +228,7 @@ ResumeGameClock (void) if (!GameClockRunning ()) { GLOBAL (GameClock.TimeCounter) = GetTimeCounter (); - ClearSemaphore (GLOBAL (GameClock.clock_sem)); + UnlockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); } UnlockMutex (clock_mutex); } @@ -245,7 +245,7 @@ SetGameClockRate (COUNT seconds_per_day) SIZE new_day_in_ticks, new_tick_count; //if (GLOBAL (GameClock.clock_sem)) fprintf (stderr, "%u\n", GLOBAL (GameClock.clock_sem)); - SetSemaphore (GLOBAL (GameClock.clock_sem)); + LockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); new_day_in_ticks = (SIZE)(seconds_per_day * CLOCK_BASE_FRAMERATE); if (GLOBAL (GameClock.day_in_ticks) == 0) new_tick_count = new_day_in_ticks; @@ -256,7 +256,7 @@ SetGameClockRate (COUNT seconds_per_day) new_tick_count = 1; GLOBAL (GameClock.day_in_ticks) = new_day_in_ticks; GLOBAL (GameClock.tick_count) = new_tick_count; - ClearSemaphore (GLOBAL (GameClock.clock_sem)); + UnlockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); } BOOLEAN diff --git a/sc2/src/sc2code/clock.h b/sc2/src/sc2code/clock.h index 0c3b4bf3f..b4fcfe232 100644 --- a/sc2/src/sc2code/clock.h +++ b/sc2/src/sc2code/clock.h @@ -56,7 +56,7 @@ typedef struct BYTE day_index, month_index; COUNT year_index; SIZE tick_count, day_in_ticks; - Semaphore clock_sem; + CrossThreadMutex clock_lock; Task clock_task; DWORD TimeCounter; diff --git a/sc2/src/sc2code/comm.c b/sc2/src/sc2code/comm.c index bf1b6b0fb..9c51fa099 100644 --- a/sc2/src/sc2code/comm.c +++ b/sc2/src/sc2code/comm.c @@ -869,10 +869,10 @@ int ambient_anim_task(void* data) while ((CommFrame = CommData.AlienFrame) == 0 && !Task_ReadState (task, TASK_EXIT)) TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); memset ((PSTR)&DisplayArray[0], 0, sizeof (DisplayArray)); SetUpSequence (Sequencer); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ActiveMask = 0; TalkAlarm = 0; @@ -901,7 +901,7 @@ int ambient_anim_task(void* data) SleepThreadUntil (LastTime + ONE_SECOND / 120); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); CurTime = GetTimeCounter (); ElapsedTicks = CurTime - LastTime; @@ -1287,7 +1287,7 @@ int ambient_anim_task(void* data) UpdateSpeechGraphics (FALSE); } UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); xform_PLUT_step(ElapsedTicks); } FinishTask (task); @@ -1319,15 +1319,15 @@ SpewPhrases (COUNT wait_track) if (wait_track == 1 || wait_track == (COUNT)~0) { ResumeTrack (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); do { TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); which_track = PlayingTrack (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } while (!which_track); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } else if (which_track <= wait_track) @@ -1338,7 +1338,7 @@ SpewPhrases (COUNT wait_track) if (GLOBAL (CurrentActivity) & CHECK_ABORT) break; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); /* FIXME: is this a ramnant of 128-tick clock? * with 120-tick clock this will sleep for 1 tick -- * for 1/120th of a second; if ONE_SECOND is upgraded @@ -1353,7 +1353,7 @@ SpewPhrases (COUNT wait_track) UpdateInputState (); #endif - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (CurrentMenuState.cancel) { SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8)); @@ -1442,7 +1442,7 @@ AlienTalkSegue (COUNT wait_track) if ((GLOBAL (CurrentActivity) & CHECK_ABORT) || (CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO)) return; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!pCurInputState->Initialized) { @@ -1504,9 +1504,9 @@ AlienTalkSegue (COUNT wait_track) pCurInputState->AnimTask = AssignTask (ambient_anim_task, 3072, "ambient animations"); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeOut); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } LastActivity &= ~CHECK_LOAD; @@ -1525,9 +1525,9 @@ AlienTalkSegue (COUNT wait_track) CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING; while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } @@ -1543,7 +1543,7 @@ AlienTalkSegue (COUNT wait_track) CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING; } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); while (AnyButtonPress (TRUE)) TaskSwitch (); @@ -1578,7 +1578,7 @@ DoCommunication (PENCOUNTER_STATE pES) if (CurrentMenuState.left) { FadeMusic (BACKGROUND_VOL, ONE_SECOND); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE); if (CommData.AlienTalkDesc.NumFrames) { @@ -1594,9 +1594,9 @@ DoCommunication (PENCOUNTER_STATE pES) CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING; while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } @@ -1609,7 +1609,7 @@ DoCommunication (PENCOUNTER_STATE pES) CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING; } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); while (AnyButtonPress (TRUE)) TaskSwitch (); @@ -1631,9 +1631,9 @@ DoCommunication (PENCOUNTER_STATE pES) if (pES->top_response == (BYTE)~0) { pES->top_response = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RefreshResponses (pES); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } if (CurrentMenuState.select) @@ -1645,11 +1645,11 @@ DoCommunication (PENCOUNTER_STATE pES) pES->phrase_buf_index); pES->phrase_buf[pES->phrase_buf_index++] = '\0'; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); FeedbackPlayerPhrase (pES->phrase_buf); StopTrack (); SetSliderImage (SetAbsFrameIndex (ActivityFrame, 2)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FadeMusic (BACKGROUND_VOL, ONE_SECOND); @@ -1676,21 +1676,21 @@ DoCommunication (PENCOUNTER_STATE pES) DWORD CurTime; FONT fLast; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISComWindow (); FeedbackPlayerPhrase (pES->phrase_buf); summary = TRUE; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); CurTime = GetTimeCounter (); SleepThreadUntil (CurTime + ONE_SECOND / 30); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_SCREEN_WIDTH; r.extent.height = SIS_SCREEN_HEIGHT - SLIDER_Y - SLIDER_HEIGHT + 2; SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x05, 0x00), 0x6E)); DrawFilledRectangle (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SetContextBackGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x05, 0x00), 0x6E)); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x10, 0x00), 0x6B)); @@ -1727,9 +1727,9 @@ DoCommunication (PENCOUNTER_STATE pES) buffer[i] = '\0'; temp++; t.pStr = buffer; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); t.baseline.y += DELTA_Y_SUMMARY; col++; if (col > MAX_COLS) @@ -1738,9 +1738,9 @@ DoCommunication (PENCOUNTER_STATE pES) t.align = ALIGN_CENTER; t.pStr = "_MORE_"; SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x17, 0x00), 0x01)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); col = 0; t.baseline.x = SAFE_X + 2; t.align = ALIGN_LEFT; @@ -1748,10 +1748,10 @@ DoCommunication (PENCOUNTER_STATE pES) WaitAnyButtonOrQuit (TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x05, 0x00), 0x6E)); DrawFilledRectangle (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x10, 0x00), 0x6B)); } } @@ -1760,9 +1760,9 @@ DoCommunication (PENCOUNTER_STATE pES) break; t.pStr = temp; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); t.baseline.y += DELTA_Y_SUMMARY; col++; if (col > MAX_COLS && curr->next != NULL) @@ -1772,9 +1772,9 @@ DoCommunication (PENCOUNTER_STATE pES) t.align = ALIGN_CENTER; t.pStr = "_MORE_"; SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x17, 0x00), 0x01)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); col = 0; t.baseline.x = SAFE_X + 2; t.align = ALIGN_LEFT; @@ -1782,22 +1782,22 @@ DoCommunication (PENCOUNTER_STATE pES) WaitAnyButtonOrQuit (TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x05, 0x00), 0x6E)); DrawFilledRectangle (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x10, 0x00), 0x6B)); } } WaitAnyButtonOrQuit (TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextFont (fLast); RefreshResponses (pES); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00)); DrawFilledRectangle (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SummaryChange = TRUE; summary = FALSE; FlushInput (); @@ -1810,7 +1810,7 @@ DoCommunication (PENCOUNTER_STATE pES) if (CurrentMenuState.left) { FadeMusic (BACKGROUND_VOL, ONE_SECOND); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); FeedbackPlayerPhrase (pES->phrase_buf); CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE); @@ -1828,9 +1828,9 @@ DoCommunication (PENCOUNTER_STATE pES) CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING; while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } @@ -1847,7 +1847,7 @@ DoCommunication (PENCOUNTER_STATE pES) RefreshResponses (pES); FadeMusic (FOREGROUND_VOL, ONE_SECOND); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); while (AnyButtonPress (TRUE)) TaskSwitch (); @@ -1866,7 +1866,7 @@ DoCommunication (PENCOUNTER_STATE pES) { COORD y; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); add_text (-2, &pES->response_list[pES->cur_response].response_text); @@ -1884,20 +1884,20 @@ DoCommunication (PENCOUNTER_STATE pES) RefreshResponses (pES); } UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } return (TRUE); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (pES->AnimTask) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ConcludeTask (pES->AnimTask); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pES->AnimTask = 0; } CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE); @@ -1906,7 +1906,7 @@ DoCommunication (PENCOUNTER_STATE pES) DestroyContext (ReleaseContext (TaskContext)); TaskContext = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushPLUTXForms (); ColorChange = FALSE; @@ -2020,15 +2020,15 @@ HailAlien (void) if (pMenuState == 0) { RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings ((BYTE)~0, 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } else /* in starbase */ { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (GET_GAME_STATE (STARBASE_AVAILABLE)) { DrawSISMessage (GAME_STRING (STARBASE_STRING_BASE + 1)); @@ -2045,7 +2045,7 @@ HailAlien (void) DrawSISComWindow (); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); LastActivity |= CHECK_LOAD; /* prevent spurious input */ (*CommData.init_encounter_func) (); @@ -2053,7 +2053,7 @@ HailAlien (void) if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))) (*CommData.uninit_encounter_func) (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DestroyStringTable (ReleaseStringTable (CommData.ConversationPhrases)); DestroyMusic ((MUSIC_REF)CommData.AlienSong); @@ -2078,7 +2078,7 @@ InitCommunication (RESOURCE which_comm) last_subtitle = NULL; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (LastActivity & CHECK_LOAD) { @@ -2087,9 +2087,9 @@ InitCommunication (RESOURCE which_comm) { if (LOBYTE (LastActivity) == 0) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } else { @@ -2147,7 +2147,7 @@ InitCommunication (RESOURCE which_comm) CommData = *LocDataPtr; } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (GET_GAME_STATE (BATTLE_SEGUE) == 0) status = HAIL; @@ -2161,7 +2161,7 @@ InitCommunication (RESOURCE which_comm) SET_GAME_STATE (BATTLE_SEGUE, 1); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (status == HAIL) { @@ -2175,7 +2175,7 @@ InitCommunication (RESOURCE which_comm) SetResourceIndex (hOldIndex); CloseResourceIndex (hIndex); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); status = 0; if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))) diff --git a/sc2/src/sc2code/comm/comandr/comandr.c b/sc2/src/sc2code/comm/comandr/comandr.c index 95232e2ad..2485e3ab9 100644 --- a/sc2/src/sc2code/comm/comandr/comandr.c +++ b/sc2/src/sc2code/comm/comandr/comandr.c @@ -216,10 +216,10 @@ NoRadioactives (RESPONSE_REF R) { NPCPhrase (HERE_IS_A_NEW_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (LANDERS_LOST, 1); } @@ -227,26 +227,26 @@ NoRadioactives (RESPONSE_REF R) { NPCPhrase (HERE_IS_ANOTHER_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (PLAYER_SAID (R, need_fuel)) { NPCPhrase (GIVE_FUEL); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (GIVEN_FUEL_BEFORE, 1); } else if (PLAYER_SAID (R, need_fuel_again)) { NPCPhrase (GIVE_FUEL_AGAIN); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } if (GLOBAL_SIS (ElementAmounts[RADIOACTIVE])) @@ -284,10 +284,10 @@ AskAfterRadios (RESPONSE_REF R) { NPCPhrase (HERE_IS_A_NEW_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (LANDERS_LOST, 1); } @@ -295,26 +295,26 @@ AskAfterRadios (RESPONSE_REF R) { NPCPhrase (HERE_IS_ANOTHER_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (PLAYER_SAID (R, need_fuel)) { NPCPhrase (GIVE_FUEL); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (GIVEN_FUEL_BEFORE, 1); } else if (PLAYER_SAID (R, need_fuel_again)) { NPCPhrase (GIVE_FUEL_AGAIN); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (PLAYER_SAID (R, where_get_radios)) { @@ -384,10 +384,10 @@ TellMoonBase (RESPONSE_REF R) { NPCPhrase (HERE_IS_A_NEW_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (LANDERS_LOST, 1); } @@ -395,26 +395,26 @@ TellMoonBase (RESPONSE_REF R) { NPCPhrase (HERE_IS_ANOTHER_LANDER); ++GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); DeltaSISGauges (4, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (PLAYER_SAID (R, need_fuel)) { NPCPhrase (GIVE_FUEL); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (GIVEN_FUEL_BEFORE, 1); } else if (PLAYER_SAID (R, need_fuel_again)) { NPCPhrase (GIVE_FUEL_AGAIN); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 5 * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (PLAYER_SAID (R, we_are_here_to_help)) { @@ -576,9 +576,9 @@ GiveRadios (RESPONSE_REF R) NPCPhrase (FUEL_UP1); AlienTalkSegue (1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); CommData.AlienAmbientArray[2].AnimFlags |= ANIM_DISABLED; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); XFormPLUT (GetColorMapAddress ( SetAbsColorMapIndex (CommData.AlienColorMap, 0) diff --git a/sc2/src/sc2code/comm/druuge/druugec.c b/sc2/src/sc2code/comm/druuge/druugec.c index f450d4806..2149c265c 100644 --- a/sc2/src/sc2code/comm/druuge/druugec.c +++ b/sc2/src/sc2code/comm/druuge/druugec.c @@ -230,9 +230,9 @@ Buy (RESPONSE_REF Response) NPCPhrase (NOT_ENOUGH_ROOM); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-SHIP_CREW_COST, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SlaveryCount += SHIP_CREW_COST; ActivateStarShip (DRUUGE_SHIP, 1); @@ -246,9 +246,9 @@ Buy (RESPONSE_REF Response) NPCPhrase (NOT_ENOUGH_CREW); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SlaveryCount += ARTIFACT_CREW_COST; SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1); SET_GAME_STATE (ROSY_SPHERE, 1); @@ -262,9 +262,9 @@ Buy (RESPONSE_REF Response) NPCPhrase (NOT_ENOUGH_CREW); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SlaveryCount += ARTIFACT_CREW_COST; SET_GAME_STATE (ARTIFACT_2_ON_SHIP, 1); @@ -277,9 +277,9 @@ Buy (RESPONSE_REF Response) NPCPhrase (NOT_ENOUGH_CREW); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SlaveryCount += ARTIFACT_CREW_COST; SET_GAME_STATE (ARTIFACT_3_ON_SHIP, 1); @@ -293,10 +293,10 @@ Buy (RESPONSE_REF Response) NPCPhrase (NOT_ENOUGH_CREW); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-FUEL_CREW_COST, FUEL_CREW_COST * FUEL_TANK_SCALE, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SlaveryCount += FUEL_CREW_COST; NPCPhrase (BOUGHT_FUEL); @@ -452,14 +452,14 @@ DoTransaction (RESPONSE_REF R) capacity -= GLOBAL_SIS (FuelOnBoard); f = (COUNT)((capacity + (FUEL_TANK_SCALE >> 1)) / FUEL_TANK_SCALE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); while (capacity > 0x3FFFL) { DeltaSISGauges (0, 0x3FFF, 0); capacity -= 0x3FFF; } DeltaSISGauges (0, (SIZE)capacity, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); NPCPhrase (FUEL0); NPCPhrase (-(int)f); diff --git a/sc2/src/sc2code/comm/melnorm/melnorm.c b/sc2/src/sc2code/comm/melnorm/melnorm.c index 919151861..1d62493c3 100644 --- a/sc2/src/sc2code/comm/melnorm/melnorm.c +++ b/sc2/src/sc2code/comm/melnorm/melnorm.c @@ -250,9 +250,9 @@ StripShip (COUNT fuel_required) if (fuel_required == 0) { GlobData.SIS_state = SIS_copy; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (UNDEFINED_DELTA, rescue_fuel, UNDEFINED_DELTA); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (fuel_required == (COUNT)~0) { @@ -276,9 +276,9 @@ StripShip (COUNT fuel_required) GLOBAL_SIS (ModuleSlots[i]) = EMPTY_SLOT + 2; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (UNDEFINED_DELTA, UNDEFINED_DELTA, UNDEFINED_DELTA); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (fuel_required) { @@ -384,9 +384,9 @@ StripShip (COUNT fuel_required) if (total == 0) { NPCPhrase (CHARITY); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, fuel_required, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } else @@ -567,9 +567,9 @@ DeltaCredit (SIZE delta_credit) Credit += delta_credit; SET_GAME_STATE (MELNORME_CREDIT0, LOBYTE (Credit)); SET_GAME_STATE (MELNORME_CREDIT1, HIBYTE (Credit)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage ((UNICODE *)~0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else { @@ -810,14 +810,14 @@ DoBuy (RESPONSE_REF R) NPCPhrase (GOT_FUEL); f = (DWORD)needed_credit * FUEL_TANK_SCALE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); while (f > 0x3FFFL) { DeltaSISGauges (0, 0x3FFF, 0); f -= 0x3FFF; } DeltaSISGauges (0, (SIZE)f, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } needed_credit *= (BIO_CREDIT_VALUE / 2); } @@ -1204,9 +1204,9 @@ DoSell (RESPONSE_REF R) } while (GLOBAL_SIS (TotalBioMass)); SleepThread (ONE_SECOND / 2); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (DRAW_SIS_DISPLAY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else /* if (R == sell_rainbow_locations) */ { @@ -1836,9 +1836,9 @@ Intro (void) static COUNT uninit_melnorme (void) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (0); } diff --git a/sc2/src/sc2code/comm/slyland/slyland.c b/sc2/src/sc2code/comm/slyland/slyland.c index d42cd2830..9951cdccb 100644 --- a/sc2/src/sc2code/comm/slyland/slyland.c +++ b/sc2/src/sc2code/comm/slyland/slyland.c @@ -208,9 +208,9 @@ CombatIsInevitable (RESPONSE_REF R) NPCPhrase (DESTRUCT_SEQUENCE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 0, race_bounty[SLYLANDRO_SHIP] >> 3); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (BATTLE_SEGUE, 0); } else diff --git a/sc2/src/sc2code/comm/starbas/starbas.c b/sc2/src/sc2code/comm/starbas/starbas.c index 225df1983..ecae522a0 100644 --- a/sc2/src/sc2code/comm/starbas/starbas.c +++ b/sc2/src/sc2code/comm/starbas/starbas.c @@ -1654,9 +1654,9 @@ NormalStarbase (RESPONSE_REF R) NPCPhrase (GLOBAL_SHIP_NAME); NPCPhrase (STARBASE_IS_READY_C); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 0, 2500); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (STARBASE_MONTH, GLOBAL (GameClock.month_index)); SET_GAME_STATE (STARBASE_DAY, @@ -1765,9 +1765,9 @@ SellMinerals (RESPONSE_REF R) Sleepy = FALSE; GLOBAL_SIS (ElementAmounts[i]) = 0; GLOBAL_SIS (TotalElementMass) -= amount; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, 0, amount * GLOBAL (ElementWorth[i])); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } @@ -1776,10 +1776,10 @@ SellMinerals (RESPONSE_REF R) TaskSwitch (); TimeIn = GetTimeCounter (); DrawCargoStrings ((BYTE)i, (BYTE)i); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ShowRemainingCapacity (); DeltaSISGauges (0, 0, GLOBAL (ElementWorth[i])); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } while (--amount); } if (Sleepy) { @@ -1789,9 +1789,9 @@ SellMinerals (RESPONSE_REF R) } SleepThread (ONE_SECOND / 2); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (DRAW_SIS_DISPLAY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); // DrawStorageBays (FALSE); if (total < 1000) diff --git a/sc2/src/sc2code/confirm.c b/sc2/src/sc2code/confirm.c index 777fd96fd..f040ed847 100644 --- a/sc2/src/sc2code/confirm.c +++ b/sc2/src/sc2code/confirm.c @@ -105,7 +105,7 @@ DoConfirmExit (void) if (CommData.ConversationPhrases && PlayingTrack ()) PauseTrack (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (in_confirm) { result = FALSE; @@ -131,12 +131,12 @@ DoConfirmExit (void) DrawConfirmationWindow (response); - // Releasing the Semaphore lets the rotate_planet_task + // Releasing the lock lets the rotate_planet_task // draw a frame. PauseRotate can still allow one more frame - // to be drawn, so it is safer to just not release the Semaphore - //ClearSemaphore (GraphicsSem); + // to be drawn, so it is safer to just not release the lock + //UnlockCrossThreadMutex (GraphicsLock); FlushGraphics (); - //SetSemaphore (GraphicsSem); + //LockCrossThreadMutex (GraphicsLock); GLOBAL (CurrentActivity) |= CHECK_ABORT; FlushInput (); @@ -181,7 +181,7 @@ DoConfirmExit (void) FlushInput (); SetContext (oldContext); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE) ResumeGameClock (); diff --git a/sc2/src/sc2code/credits.c b/sc2/src/sc2code/credits.c index bf4847680..f7a1bd3c2 100644 --- a/sc2/src/sc2code/credits.c +++ b/sc2/src/sc2code/credits.c @@ -54,7 +54,7 @@ Credits (void) if (hMusic) PlayMusic (hMusic, TRUE, 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); GetContextClipRect (&r); s.origin.x = s.origin.y = 0; @@ -81,19 +81,19 @@ Credits (void) UnbatchGraphics (); DestroyDrawable (ReleaseDrawable (f[i])); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); while ((GetTimeCounter () - TimeIn < ONE_SECOND * 5) && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) { UpdateInputState (); SleepThreadUntil (ONE_SECOND / 20); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); TimeIn = GetTimeCounter (); } DestroyDrawable (ReleaseDrawable (f[0])); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); WaitAnyButtonOrQuit (FALSE); @@ -139,7 +139,7 @@ OutTakes (void) optSubtitles = TRUE; sliderDisabled = TRUE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0, 0x0, 0x0), 0x00)); fade_buf[0] = FadeAllToColor; @@ -149,7 +149,7 @@ OutTakes (void) r.extent.width = SCREEN_WIDTH; r.extent.height = SCREEN_HEIGHT; DrawFilledRectangle (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); for (i = 0; (i < NUM_OUTTAKES) && !(GLOBAL (CurrentActivity) & CHECK_ABORT); i++) diff --git a/sc2/src/sc2code/encount.c b/sc2/src/sc2code/encount.c index 9c0675235..455026ced 100644 --- a/sc2/src/sc2code/encount.c +++ b/sc2/src/sc2code/encount.c @@ -47,9 +47,9 @@ DoSelectAction (PMENU_STATE pMS) if (pMS->Initialized) { DrawMenuStateStrings (PM_CONVERSE, pMS->CurState); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } return ((BOOLEAN)pMS->Initialized); default: @@ -173,7 +173,7 @@ InitEncounter (void) extern FRAME planet[]; MUSIC_REF MR; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); hOldIndex = SetResourceIndex (hResIndex); @@ -183,12 +183,12 @@ InitEncounter (void) MR = LoadMusicInstance (REDALERT_MUSIC); PlayMusic (MR, FALSE, 1); SegueFrame = CaptureDrawable (LoadGraphic (SEGUE_PMAP_ANIM)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); while (PLRPlaying (MR)) TaskSwitch (); StopMusic (); DestroyMusic (MR); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); s.origin.x = s.origin.y = 0; SetTransitionSource (NULL); @@ -300,7 +300,7 @@ InitEncounter (void) SetResourceIndex (hOldIndex); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); { MENU_STATE MenuState; @@ -309,15 +309,15 @@ InitEncounter (void) MenuState.Initialized = FALSE; DrawMenuStateStrings (PM_CONVERSE, MenuState.CurState = HAIL); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DoInput ((PVOID)&MenuState, TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (MenuState.CurState); } @@ -357,10 +357,10 @@ DrawFadeText (UNICODE *str1, UNICODE *str2, BOOLEAN fade_in, PRECT { for (i = 0; i < (SIZE) NUM_FADES; ++i) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (AnyButtonPress (TRUE)) i = NUM_FADES - 1; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (fade_cycle[i]); font_DrawText (&t1); @@ -373,10 +373,10 @@ DrawFadeText (UNICODE *str1, UNICODE *str2, BOOLEAN fade_in, PRECT { for (i = NUM_FADES - 1; i >= 0; --i) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (AnyButtonPress (TRUE)) i = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextForeGroundColor (fade_cycle[i]); font_DrawText (&t1); @@ -397,7 +397,7 @@ UninitEncounter (void) ships_killed = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); free_gravity_well (); if ((GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)) @@ -478,9 +478,9 @@ UninitEncounter (void) VictoryState = 0; else { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISMessage (NULL_PTR); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) @@ -601,9 +601,9 @@ UninitEncounter (void) Time = GetTimeCounter (); for (j = 0; j < NUM_SHIP_FADES; ++j) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); Sleepy = (BOOLEAN)!AnyButtonPress (TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!Sleepy) break; @@ -637,10 +637,10 @@ UninitEncounter (void) FlushInput (); Time = GetTimeCounter () + (ONE_SECOND * 3); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); while (!(AnyButtonPress (TRUE)) && GetTimeCounter () < Time) TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!CurrentInputState.p1_escape) { DrawFadeText (str1, str2, FALSE, &scavenge_r); @@ -668,11 +668,11 @@ UninitEncounter (void) &scavenge_r ); Time = GetTimeCounter () + ONE_SECOND * 2; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); while (!(AnyButtonPress (TRUE)) && GetTimeCounter () < Time) TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!CurrentInputState.p1_escape) DrawFadeText (str1, str2, FALSE, &scavenge_r); } @@ -691,7 +691,7 @@ UninitEncounter (void) } } ExitUninitEncounter: - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (ships_killed); } @@ -705,7 +705,7 @@ EncounterBattle (void) extern BOOLEAN LoadSC2Data (void); extern BOOLEAN FreeSC2Data (void); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (BATTLE_SEGUE, 1); @@ -741,9 +741,9 @@ EncounterBattle (void) GameSounds = CaptureSound (LoadSound (GAME_SOUNDS)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); Battle (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DestroySound (ReleaseSound (GameSounds)); GameSounds = 0; @@ -769,6 +769,6 @@ EncounterBattle (void) SetResourceIndex (hLastIndex); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } diff --git a/sc2/src/sc2code/fmv.c b/sc2/src/sc2code/fmv.c index 171c9a928..169a2c9b2 100644 --- a/sc2/src/sc2code/fmv.c +++ b/sc2/src/sc2code/fmv.c @@ -79,13 +79,13 @@ Introduction (void) xform_buf[0] = FadeAllToBlack; SleepThreadUntil (XFormColorMap ( (COLORMAPPTR) xform_buf, ONE_SECOND / 120)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); s.origin.x = s.origin.y = 0; s.frame = CaptureDrawable (LoadGraphic (TITLE_ANIM)); DrawStamp (&s); DestroyDrawable (ReleaseDrawable (s.frame)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); xform_buf[0] = FadeAllToColor; TimeOut = XFormColorMap ((COLORMAPPTR)xform_buf, ONE_SECOND / 2); diff --git a/sc2/src/sc2code/gameopt.c b/sc2/src/sc2code/gameopt.c index e132c397e..11eee8deb 100644 --- a/sc2/src/sc2code/gameopt.c +++ b/sc2/src/sc2code/gameopt.c @@ -163,9 +163,9 @@ FeedbackSetting (BYTE which_setting) break; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (buf); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void FeedbackQuit (BYTE which_setting) @@ -182,9 +182,9 @@ FeedbackQuit (BYTE which_setting) break; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (buf); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static BOOLEAN DoSettings (PMENU_STATE pMS); @@ -199,7 +199,7 @@ DrawDescriptionString (PMENU_STATE pMS, COUNT which_string, SIZE state) FONT Font; static BOOLEAN DoNaming (PMENU_STATE pMS); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); rel_index = (COUNT)(which_string - pMS->first_item.y); @@ -276,7 +276,7 @@ DrawDescriptionString (PMENU_STATE pMS, COUNT which_string, SIZE state) TextRect (&lf, &text_r, char_deltas); if ((text_r.extent.width + 2) >= r.extent.width) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } @@ -310,7 +310,7 @@ DrawDescriptionString (PMENU_STATE pMS, COUNT which_string, SIZE state) SetFlashRect (&r, (FRAME)0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (TRUE); } @@ -436,9 +436,9 @@ DoNaming (PMENU_STATE pMS) pMS->CurString = (STRING)&GD[0]; DrawDescriptionString (pMS, pMS->CurState, 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (GAME_STRING (NAMING_STRING_BASE + 0)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); EnableCharacterMode (); DoInput (pMS, TRUE); @@ -513,9 +513,9 @@ DoSettings (PMENU_STATE pMS) || (CurrentMenuState.select && pMS->CurState == EXIT_MENU_SETTING)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (NULL_PTR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->CurState = SETTINGS; pMS->InputFunc = DoGameOptions; @@ -582,9 +582,9 @@ DoQuitMenu (PMENU_STATE pMS) || (CurrentMenuState.select && pMS->CurState == NO_QUIT_MENU)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (NULL_PTR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->CurState = QUIT_GAME; pMS->InputFunc = DoGameOptions; @@ -858,9 +858,9 @@ ShowSummary (SUMMARY_DESC *pSD) r.corner.y = SIS_ORG_Y + 84; r.extent = OldRect.extent; SetContextClipRect (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); InitLander ((unsigned char)(pSD->Flags | OVERRIDE_LANDER_FLAGS)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContextClipRect (&OldRect); SetContext (SpaceContext); @@ -1002,7 +1002,7 @@ DoPickGame (PMENU_STATE pMS) pMS->ModuleFrame = SetAbsFrameIndex (PlayFrame, 41); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetTransitionSource (NULL); BatchGraphics (); Restart: @@ -1037,7 +1037,7 @@ Restart: prev_save = pMS->CurState; if (pMS->delta_item == SAVE_GAME || pSD->year_index) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (pMS->delta_item == SAVE_GAME) { STAMP MsgStamp; @@ -1056,13 +1056,13 @@ Restart: SetFlashRect (NULL_PTR, (FRAME)0); DrawStamp (&MsgStamp); DestroyDrawable (ReleaseDrawable (MsgStamp.frame)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SaveProblem (); pMS->Initialized = FALSE; NewState = pMS->CurState; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); goto Restart; } @@ -1088,7 +1088,7 @@ Restart: GLOBAL (CurrentActivity) |= CHECK_LOAD; } SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->ModuleFrame = 0; pMS->CurState = (BYTE)pMS->delta_item; @@ -1137,7 +1137,7 @@ Restart: TEXT t; BYTE i, SHIFT; UNICODE buf[80],buf2[15]; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); if (((SUMMARY_DESC *)pMS->CurString)[NewState].year_index != 0) @@ -1243,7 +1243,7 @@ ChangeGameSelection: font_DrawText (&t); } SetFlashRect (0, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -1266,7 +1266,7 @@ PickGame (PMENU_STATE pMS) TaskSwitch (); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); DlgStamp.origin.x = 0; @@ -1282,11 +1282,11 @@ PickGame (PMENU_STATE pMS) pMS->Initialized = FALSE; pMS->InputFunc = DoPickGame; pMS->CurString = (STRING)&desc_array[0]; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DoInput (pMS, TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pMS->Initialized = -1; pMS->InputFunc = DoGameOptions; @@ -1338,7 +1338,7 @@ PickGame (PMENU_STATE pMS) DestroyDrawable (ReleaseDrawable (DlgStamp.frame)); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (retval); } diff --git a/sc2/src/sc2code/hyper.c b/sc2/src/sc2code/hyper.c index b1a0514f0..182fabe17 100644 --- a/sc2/src/sc2code/hyper.c +++ b/sc2/src/sc2code/hyper.c @@ -322,9 +322,9 @@ LoadHyperspace (void) { if (LOBYTE (LastActivity) == 0) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } else { @@ -360,9 +360,9 @@ LoadHyperspace (void) BOOLEAN FreeHyperspace (void) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SuspendGameClock (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); { FRAME F; @@ -1601,7 +1601,7 @@ UnbatchGraphics (); OldContext = SetContext (SpaceContext); OldColor = SetContextBackGroundColor (BLACK_COLOR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SuspendGameClock (); memset ((PMENU_STATE)&MenuState, 0, sizeof (MenuState)); @@ -1610,13 +1610,13 @@ UnbatchGraphics (); MenuState.CurState = STARMAP + 1; DrawMenuStateStrings (PM_STARMAP, STARMAP); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DoInput ((PVOID)&MenuState, TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); SetContext (SpaceContext); @@ -1624,10 +1624,10 @@ UnbatchGraphics (); if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))) { ClearSISRect (CLEAR_SIS_RADAR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); WaitForNoInput (ONE_SECOND / 2); ResumeGameClock (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } SetContextBackGroundColor (OldColor); diff --git a/sc2/src/sc2code/init.c b/sc2/src/sc2code/init.c index e8e387dc2..57b9c6509 100644 --- a/sc2/src/sc2code/init.c +++ b/sc2/src/sc2code/init.c @@ -270,8 +270,12 @@ InitGlobData (void) GLOBAL (DisplayArray) = DisplayArray; // The clock semaphore was initially initialized as '1' // but it is always cleared before set, so it toggled between - // 2 and 1, which doesn't actually do anything - GLOBAL (GameClock.clock_sem) = CreateSemaphore(0, "Clock"); + // 2 and 1, which doesn't actually do anything. When this + // was transformed into a mutex, we lock it first to prevent + // double-unlock. + + GLOBAL (GameClock.clock_lock) = CreateCrossThreadMutex("Clock"); + LockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); } int diff --git a/sc2/src/sc2code/intro.c b/sc2/src/sc2code/intro.c index 82d4a02f0..4b8740741 100644 --- a/sc2/src/sc2code/intro.c +++ b/sc2/src/sc2code/intro.c @@ -50,13 +50,13 @@ Introduction (void) xform_buf[0] = FadeAllToBlack; SleepThreadUntil (XFormColorMap ( (COLORMAPPTR)xform_buf, ONE_SECOND / 120)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); s.origin.x = s.origin.y = 0; s.frame = CaptureDrawable (LoadGraphic (TITLE_ANIM)); DrawStamp (&s); DestroyDrawable (ReleaseDrawable (s.frame)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); diff --git a/sc2/src/sc2code/libs/graphics/sdl/dcqueue.c b/sc2/src/sc2code/libs/graphics/sdl/dcqueue.c index 35c7093a9..7b3e2bef7 100644 --- a/sc2/src/sc2code/libs/graphics/sdl/dcqueue.c +++ b/sc2/src/sc2code/libs/graphics/sdl/dcqueue.c @@ -44,7 +44,11 @@ _lock (void) Uint32 current_thread = SDL_ThreadID (); if (DCQ_locking_thread != current_thread) { - LockMutex (DCQ_lock); + if (LockMutex (DCQ_lock)) + { + fprintf (stderr, "DCQ lock attempt failed!\n"); + return; + } DCQ_locking_thread = current_thread; } ++DCQ_locking_depth; diff --git a/sc2/src/sc2code/libs/threadlib.h b/sc2/src/sc2code/libs/threadlib.h index 89347bb66..9ca91a644 100644 --- a/sc2/src/sc2code/libs/threadlib.h +++ b/sc2/src/sc2code/libs/threadlib.h @@ -67,10 +67,10 @@ This is now a compile-time define # endif #endif -extern void InitThreadSystem (void); -extern void UnInitThreadSystem (void); -extern void init_cond_bank (void); -extern void uninit_cond_bank (void); +void InitThreadSystem (void); +void UnInitThreadSystem (void); +void init_cond_bank (void); +void uninit_cond_bank (void); typedef int (*ThreadFunction) (void *); @@ -88,64 +88,70 @@ typedef struct Thread { } *Thread; #ifdef THREAD_NAMES -extern Thread CreateThreadAux (ThreadFunction func, void *data, +Thread CreateThreadAux (ThreadFunction func, void *data, SDWORD stackSize, const char *name); # define CreateThread(func, data, stackSize, name) \ CreateThreadAux ((func), (data), (stackSize), (name)) #else /* !defined(THREAD_NAMES) */ -extern Thread CreateThreadAux (ThreadFunction func, void *data, +Thread CreateThreadAux (ThreadFunction func, void *data, SDWORD stackSize); # define CreateThread(func, data, stackSize, name) \ CreateThreadAux ((func), (data), (stackSize)) #endif /* !defined(THREAD_NAMES) */ -extern void SleepThread (TimePeriod timePeriod); -extern void SleepThreadUntil (TimeCount wakeTime); -extern void TaskSwitch (void); -extern void WaitThread (Thread thread, int *status); +void SleepThread (TimePeriod timePeriod); +void SleepThreadUntil (TimeCount wakeTime); +void TaskSwitch (void); +void WaitThread (Thread thread, int *status); typedef void *Semaphore; #ifdef DEBUG_TRACK_SEM -extern Semaphore CreateSemaphoreAux (DWORD initial, const char *sem_name); +Semaphore CreateSemaphoreAux (DWORD initial, const char *sem_name); # define CreateSemaphore(initial,sem_name) \ CreateSemaphoreAux ((initial), (sem_name)) -extern void ResetSemaphoreOwnerAux (Semaphore sem); +void ResetSemaphoreOwnerAux (Semaphore sem); # define ResetSemaphoreOwner(sem_name) \ ResetSemaphoreOwnerAux (sem_name) #else -extern Semaphore CreateSemaphoreAux (DWORD initial); +Semaphore CreateSemaphoreAux (DWORD initial); # define CreateSemaphore(initial,sem_name) \ CreateSemaphoreAux ((initial)) # define ResetSemaphoreOwner(sem_name) #endif -extern DWORD SemaphoreValue (Semaphore sem); -extern void DestroySemaphore (Semaphore sem); -extern int SetSemaphore (Semaphore sem); -extern int TrySetSemaphore (Semaphore sem); -extern int TimeoutSetSemaphore (Semaphore sem, TimePeriod timeout); -extern void ClearSemaphore (Semaphore sem); +DWORD SemaphoreValue (Semaphore sem); +void DestroySemaphore (Semaphore sem); +int SetSemaphore (Semaphore sem); +int TrySetSemaphore (Semaphore sem); +int TimeoutSetSemaphore (Semaphore sem, TimePeriod timeout); +void ClearSemaphore (Semaphore sem); #ifdef PROFILE_THREADS -extern void PrintThreadsStats (void); +void PrintThreadsStats (void); #endif /* PROFILE_THREADS */ typedef void *Mutex; -extern Mutex CreateMutex (void); -extern void DestroyMutex (Mutex sem); -extern int LockMutex (Mutex sem); -extern void UnlockMutex (Mutex sem); +Mutex CreateMutex (void); +void DestroyMutex (Mutex sem); +int LockMutex (Mutex sem); +void UnlockMutex (Mutex sem); + +typedef void *CrossThreadMutex; +CrossThreadMutex CreateCrossThreadMutex (const char *name); +void DestroyCrossThreadMutex (CrossThreadMutex ctm); +int LockCrossThreadMutex (CrossThreadMutex ctm); +void UnlockCrossThreadMutex (CrossThreadMutex ctm); typedef void *CondVar; -extern CondVar CreateCondVar (void); -extern void DestroyCondVar (CondVar); -extern void WaitCondVar (CondVar); -extern void WaitProtectedCondVar (CondVar, Mutex); -extern void SignalCondVar (CondVar); -extern void BroadcastCondVar (CondVar); +CondVar CreateCondVar (void); +void DestroyCondVar (CondVar); +void WaitCondVar (CondVar); +void WaitProtectedCondVar (CondVar, Mutex); +void SignalCondVar (CondVar); +void BroadcastCondVar (CondVar); -extern DWORD CurrentThreadID (void); +DWORD CurrentThreadID (void); -extern int FindSignalChannel (); -extern void WaitForSignal (int); -extern void SignalThread (DWORD); +int FindSignalChannel (); +void WaitForSignal (int); +void SignalThread (DWORD); #endif /* _THREADLIB_H */ diff --git a/sc2/src/sc2code/libs/threads/sdl/sdlthreads.c b/sc2/src/sc2code/libs/threads/sdl/sdlthreads.c index ddf67fc6e..3fbd2c31b 100644 --- a/sc2/src/sc2code/libs/threads/sdl/sdlthreads.c +++ b/sc2/src/sc2code/libs/threads/sdl/sdlthreads.c @@ -17,6 +17,8 @@ /* By Serge van den Boom */ +#include +#include "misc.h" #include "sdlthreads.h" #if defined(PROFILE_THREADS) && !defined(WIN32) @@ -84,3 +86,76 @@ SDLWrapper_WaitCondVar (CondVar cv) { fprintf (stderr, "Error result from SDL_CondWait: %d\n", result); } } + +/* Code for cross-thread mutexes. The prototypes for these functions are in threadlib.h. */ + +typedef struct _ctm { + SDL_mutex *mutex; + SDL_cond *cond; + const char *name; + BOOLEAN locked; +} _NativeCTM; + +CrossThreadMutex +CreateCrossThreadMutex (const char *name) +{ + _NativeCTM *result = HMalloc (sizeof (_NativeCTM)); + result->mutex = SDL_CreateMutex (); + result->cond = SDL_CreateCond (); + result->name = name; + result->locked = FALSE; + return (CrossThreadMutex)result; +} + +void +DestroyCrossThreadMutex (CrossThreadMutex val) +{ + _NativeCTM *ctm = (_NativeCTM *)val; + if (ctm) + { + SDL_DestroyMutex (ctm->mutex); + SDL_DestroyCond (ctm->cond); + HFree (ctm); + } +} + +int +LockCrossThreadMutex (CrossThreadMutex val) +{ + _NativeCTM *ctm = (_NativeCTM *)val; + if (SDL_mutexP (ctm->mutex)) + { + fprintf (stderr, "LockCrossThreadMutex failed to lock internal mutex in %s!\n", ctm->name); + return -1; + } + while (ctm->locked) + { + // fprintf (stderr, "Thread %8x goes to sleep, waiting on %s\n", SDL_ThreadID (), ctm->name); + SDL_CondWait (ctm->cond, ctm->mutex); + // fprintf (stderr, "Thread %8x awakens.\n", SDL_ThreadID ()); + } + ctm->locked = TRUE; + SDL_mutexV (ctm->mutex); + return 0; /* success */ +} + +void +UnlockCrossThreadMutex (CrossThreadMutex val) +{ + _NativeCTM *ctm = (_NativeCTM *)val; + if (SDL_mutexP (ctm->mutex)) + { + fprintf (stderr, "UnlockCrossThreadMutex failed to lock internal mutex in %s!\n", ctm->name); + return; + } + if (ctm->locked) + { + ctm->locked = FALSE; + SDL_CondSignal (ctm->cond); + } + else + { + fprintf (stderr, "Double unlock attempt on %s ignored.\n", ctm->name); + } + SDL_mutexV (ctm->mutex); +} diff --git a/sc2/src/sc2code/load.c b/sc2/src/sc2code/load.c index 7af4b0e86..49a2221cb 100644 --- a/sc2/src/sc2code/load.c +++ b/sc2/src/sc2code/load.c @@ -96,7 +96,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) uio_Stream *fp; DECODE_REF fh; COUNT num_links; - Semaphore clock_sem; + CrossThreadMutex clock_lock; Task clock_task; QUEUE event_q, encounter_q, avail_q, npc_q, player_q; STAR_DESC SD; @@ -126,7 +126,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (built_ship_q)); - clock_sem = GLOBAL (GameClock.clock_sem); + clock_lock = GLOBAL (GameClock.clock_lock); clock_task = GLOBAL (GameClock.clock_task); event_q = GLOBAL (GameClock.event_q); encounter_q = GLOBAL (encounter_q); @@ -141,7 +141,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) NextActivity = GLOBAL (CurrentActivity); GLOBAL (CurrentActivity) = Activity; - GLOBAL (GameClock.clock_sem) = clock_sem; + GLOBAL (GameClock.clock_lock) = clock_lock; GLOBAL (GameClock.clock_task) = clock_task; GLOBAL (GameClock.event_q) = event_q; GLOBAL (encounter_q) = encounter_q; diff --git a/sc2/src/sc2code/melee.c b/sc2/src/sc2code/melee.c index 20a2bceb0..ac55265b7 100644 --- a/sc2/src/sc2code/melee.c +++ b/sc2/src/sc2code/melee.c @@ -224,9 +224,9 @@ DrawPickFrame (PMELEE_STATE pMS) + (ship_r.extent.height - r.extent.height)); SetFrameHot (F, MAKE_HOT_SPOT (r.corner.x, r.corner.y)); DrawMeleeIcon (27); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMeleeShipStrings (pMS, (BYTE)pMS->CurIndex); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } static void @@ -518,19 +518,19 @@ int flash_selection_func(void* data) #define FLASH_RATE (ONE_SECOND / 8) CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); Deselect (pMeleeState->MeleeOption); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + FLASH_RATE); TimeIn = GetTimeCounter (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); Select (pMeleeState->MeleeOption); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + FLASH_RATE); TimeIn = GetTimeCounter (); } @@ -571,7 +571,7 @@ DrawMeleeShipStrings (PMELEE_STATE pMS, BYTE NewStarShip) STARSHIPPTR StarShipPtr; CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (StatusContext); GetContextClipRect (&OldRect); @@ -630,7 +630,7 @@ DrawMeleeShipStrings (PMELEE_STATE pMS, BYTE NewStarShip) SetContextClipRect (&OldRect); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static COUNT @@ -846,7 +846,7 @@ DoLoadTeam (PMELEE_STATE pMS) if (!pMS->Initialized) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Select (pMS->MeleeOption); if ((pMS->TopTeamIndex = pMS->CurIndex) == (COUNT)~0) pMS->TopTeamIndex = pMS->CurIndex = 0; @@ -858,7 +858,7 @@ DoLoadTeam (PMELEE_STATE pMS) DrawFileStrings (pMS, -1); pMS->Initialized = TRUE; pMS->InputFunc = DoLoadTeam; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (CurrentMenuState.select | CurrentMenuState.cancel) { @@ -876,9 +876,9 @@ DoLoadTeam (PMELEE_STATE pMS) RECT r; GetFrameRect (SetAbsFrameIndex (MeleeFrame, 28), &r); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairMeleeFrame (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } InTime = GetTimeCounter (); } @@ -932,7 +932,7 @@ DoLoadTeam (PMELEE_STATE pMS) if (index != old_index) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if ((int)NewTop == (int)pMS->TopTeamIndex) Deselect (pMS->MeleeOption); else @@ -941,7 +941,7 @@ DoLoadTeam (PMELEE_STATE pMS) DrawFileStrings (pMS, -1); } pMS->CurIndex = index; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -1076,7 +1076,7 @@ DoSaveTeam (PMELEE_STATE pMS) sprintf (file, "%s.mle", pMS->TeamImage[pMS->side].TeamName); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (ScreenContext); ConfirmSaveLoad (&MsgStamp); save_fp = res_OpenResFile (meleeDir, file, "wb"); @@ -1097,7 +1097,7 @@ DoSaveTeam (PMELEE_STATE pMS) DrawStamp (&MsgStamp); DestroyDrawable (ReleaseDrawable (MsgStamp.frame)); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DeleteResFile (meleeDir, file); SaveProblem (); @@ -1110,7 +1110,7 @@ DoSaveTeam (PMELEE_STATE pMS) DrawStamp (&MsgStamp); DestroyDrawable (ReleaseDrawable (MsgStamp.frame)); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } return (save_fp != 0); @@ -1135,12 +1135,12 @@ DeleteCurrentShip (PMELEE_STATE pMS) pMS->TeamImage[pMS->side].ShipList[pMS->row][pMS->col] = (BYTE)~0; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); GetShipBox (&r, pMS->side, pMS->row, pMS->col); RepairMeleeFrame (&r); DrawTeamString (pMS, 4); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } @@ -1177,12 +1177,12 @@ DoEdit (PMELEE_STATE pMS) || (CurrentMenuState.right && (pMS->col == NUM_MELEE_COLUMNS - 1 || pMS->row == NUM_MELEE_ROWS)))) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (EDIT_MELEE); pMS->CurIndex = (COUNT)~0; pMS->MeleeOption = START_MELEE; pMS->InputFunc = DoMelee; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); InTime = GetTimeCounter (); } else if (pMS->row < NUM_MELEE_ROWS @@ -1213,7 +1213,7 @@ DoEdit (PMELEE_STATE pMS) if (pMS->CurIndex != (BYTE)~0) { UNICODE ch; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (pMS->Initialized == 1) { FlushInput (); @@ -1226,15 +1226,15 @@ DoEdit (PMELEE_STATE pMS) pMS->Initialized = 1; DisableCharacterMode (); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (TRUE); } else if (CurrentMenuState.select) { pMS->CurIndex = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawTeamString (pMS, 1); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); EnableCharacterMode (); return (TRUE); } @@ -1282,7 +1282,7 @@ DoEdit (PMELEE_STATE pMS) if (col != pMS->col || row != pMS->row || side != pMS->side) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (EDIT_MELEE); pMS->side = side; pMS->row = row; @@ -1291,7 +1291,7 @@ DoEdit (PMELEE_STATE pMS) pMS->CurIndex = (BYTE)~0; else pMS->CurIndex = pMS->TeamImage[side].ShipList[row][col]; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMeleeShipStrings (pMS, (BYTE)(pMS->CurIndex)); } @@ -1319,21 +1319,21 @@ DoPickShip (PMELEE_STATE pMS) if (pMS->Initialized == 0) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (EDIT_MELEE); pMS->InputFunc = DoPickShip; DrawPickFrame (pMS); pMS->Initialized = TRUE; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (EDIT_MELEE); pMS->Initialized = TRUE; AdvanceCursor (pMS); pMS->CurIndex = pMS->TeamImage[pMS->side].ShipList[pMS->row][pMS->col]; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMeleeShipStrings (pMS, (BYTE)(pMS->CurIndex)); } @@ -1353,10 +1353,10 @@ DoPickShip (PMELEE_STATE pMS) UnlockStarShip (&master_q, hStarShip); pMS->TeamImage[pMS->side].ShipList[pMS->row][pMS->col] = pMS->CurIndex; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawTeamString (pMS, 4); DrawShipBox (pMS, FALSE); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); AdvanceCursor (pMS); } @@ -1364,9 +1364,9 @@ DoPickShip (PMELEE_STATE pMS) RECT r; GetFrameRect (SetAbsFrameIndex (MeleeFrame, 27), &r); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairMeleeFrame (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } pMS->CurIndex = pMS->TeamImage[pMS->side].ShipList[pMS->row][pMS->col]; @@ -1416,10 +1416,10 @@ DoPickShip (PMELEE_STATE pMS) if (NewStarShip != pMS->CurIndex) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (EDIT_MELEE); pMS->CurIndex = NewStarShip; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMeleeShipStrings (pMS, NewStarShip); } } @@ -1469,9 +1469,9 @@ FreeMeleeInfo (PMELEE_STATE pMS) { if (pMS->flash_task) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Task_SetState (pMS->flash_task, TASK_EXIT); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->flash_task = 0; } DestroyDirEntryTable (ReleaseDirEntryTable (pMS->TeamDE)); @@ -1591,9 +1591,9 @@ DoMelee (PMELEE_STATE pMS) { pMS->Initialized = TRUE; pMS->MeleeOption = START_MELEE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); InitMelee (pMS); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); { BYTE clut_buf[] = {FadeAllToColor}; @@ -1603,10 +1603,10 @@ DoMelee (PMELEE_STATE pMS) } else if (CurrentMenuState.cancel || CurrentMenuState.left) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); InTime = GetTimeCounter (); Deselect (pMS->MeleeOption); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->MeleeOption = EDIT_MELEE; pMS->Initialized = FALSE; if (CurrentMenuState.cancel) @@ -1644,11 +1644,11 @@ DoMelee (PMELEE_STATE pMS) if (NewMeleeOption != pMS->MeleeOption) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Deselect (pMS->MeleeOption); pMS->MeleeOption = NewMeleeOption; Select (pMS->MeleeOption); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } if (CurrentMenuState.select || force_select) @@ -1665,9 +1665,9 @@ DoMelee (PMELEE_STATE pMS) if (pMS->flash_task) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); Task_SetState (pMS->flash_task, TASK_EXIT); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->flash_task = 0; } @@ -1681,9 +1681,9 @@ DoMelee (PMELEE_STATE pMS) } do { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BuildAndDrawShipList (pMS); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); WaitForSoundEnd (TFBSOUND_WAIT_ALL); diff --git a/sc2/src/sc2code/menu.c b/sc2/src/sc2code/menu.c index c041cd204..487768c37 100644 --- a/sc2/src/sc2code/menu.c +++ b/sc2/src/sc2code/menu.c @@ -516,7 +516,7 @@ DrawMenuStateStrings (BYTE beg_index, SWORD NewState) if (NewState <= end_index - beg_index) s.frame = SetAbsFrameIndex (PlayFrame, beg_index + NewState); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (StatusContext); GetContextClipRect (&r); s.origin.x = RADAR_X - r.corner.x; @@ -631,6 +631,6 @@ DrawMenuStateStrings (BYTE beg_index, SWORD NewState) && flash_rect.extent.height == RADAR_HEIGHT) SetFlashRect ((PRECT)~0L, (FRAME)0); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } diff --git a/sc2/src/sc2code/outfit.c b/sc2/src/sc2code/outfit.c index e58bc0c07..37d29fc88 100644 --- a/sc2/src/sc2code/outfit.c +++ b/sc2/src/sc2code/outfit.c @@ -220,7 +220,7 @@ DoInstallModule (PMENU_STATE pMS) pMS->InputFunc = DoInstallModule; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); ClearSISRect (CLEAR_SIS_RADAR); @@ -270,7 +270,7 @@ DoInstallModule (PMENU_STATE pMS) } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); SetFlashRect (NULL_PTR, (FRAME)0); @@ -354,15 +354,15 @@ DoInstallModule (PMENU_STATE pMS) else { SetContext (StatusContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_FUEL, pMS->CurState = OUTFIT_MODULES); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); pMS->InputFunc = DoOutfit; ClearSISRect (DRAW_SIS_DISPLAY); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (motion) { @@ -408,7 +408,7 @@ DoInstallModule (PMENU_STATE pMS) || (NewItem >= GUN_WEAPON && NewItem <= CANNON_WEAPON && pMS->delta_item > 0 && pMS->delta_item < 13))); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (NewState < EMPTY_SLOT) { if (NewItem != pMS->CurState) @@ -505,7 +505,7 @@ InitFlash: else SetFlashRect (&pMS->flash_rect0, (FRAME)0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } return (TRUE); @@ -519,7 +519,7 @@ ChangeFuelQuantity () if (CurrentMenuState.up) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); if (GetFTankCapacity (&r.corner) > GLOBAL_SIS (FuelOnBoard) && GLOBAL_SIS (ResUnits) >= @@ -541,11 +541,11 @@ ChangeFuelQuantity () GetGaugeRect (&r, FALSE); SetFlashRect (&r, (FRAME)0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (CurrentMenuState.down) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); if (GLOBAL_SIS (FuelOnBoard)) { @@ -563,7 +563,7 @@ ChangeFuelQuantity () SetContext (StatusContext); GetGaugeRect (&r, FALSE); SetFlashRect (&r, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -600,7 +600,7 @@ DoOutfit (PMENU_STATE pMS) SetTransitionSource (NULL); BatchGraphics (); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISMessage (GAME_STRING (STARBASE_STRING_BASE + 2)); DrawSISTitle (GAME_STRING (STARBASE_STRING_BASE)); @@ -656,13 +656,13 @@ DoOutfit (PMENU_STATE pMS) DrawStamp ((PSTAMP)&s); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_FUEL, pMS->CurState); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawFlagshipName (FALSE); if (optWhichFonts == OPT_PC) DrawFlagshipStats (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); { RECT r; @@ -676,9 +676,9 @@ DoOutfit (PMENU_STATE pMS) PlayMusic (pMS->hMusic, TRUE, 1); UnbatchGraphics (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); GLOBAL_SIS (FuelOnBoard) = (GLOBAL_SIS (FuelOnBoard) @@ -695,9 +695,9 @@ DoOutfit (PMENU_STATE pMS) if (pMS->CurState == OUTFIT_DOFUEL) { pMS->CurState = OUTFIT_FUEL; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else { @@ -719,18 +719,18 @@ ExitOutfit: RECT r; pMS->CurState = OUTFIT_DOFUEL; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (StatusContext); GetGaugeRect (&r, FALSE); SetFlashRect (&r, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } case OUTFIT_DOFUEL: pMS->CurState = OUTFIT_FUEL; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; case OUTFIT_MODULES: pMS->CurState = EMPTY_SLOT + 2; @@ -746,9 +746,9 @@ ExitOutfit: if (GameOptions () == 0) goto ExitOutfit; DrawMenuStateStrings (PM_FUEL, pMS->CurState); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } } diff --git a/sc2/src/sc2code/pickmele.c b/sc2/src/sc2code/pickmele.c index 326e85023..845078c9d 100644 --- a/sc2/src/sc2code/pickmele.c +++ b/sc2/src/sc2code/pickmele.c @@ -119,7 +119,7 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) TimeOut = GetTimeCounter () + (ONE_SECOND * 4); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); UpdateInputState (); PressState = AnyButtonPress (TRUE); @@ -142,7 +142,7 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) ConfirmExit (); */ - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); return (0); } @@ -243,7 +243,7 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) col = new_col; PlaySoundEffect (MenuSounds, 0, NotPositional (), NULL, 0); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ChangeSelection: flash_rect.corner.x = PICK_X_OFFS + ((ICON_WIDTH + 2) * col); @@ -293,12 +293,12 @@ ChangeSelection: UnlockStarShip (&race_q[which_player], hBattleShip); } } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); if (hBattleShip == 0) diff --git a/sc2/src/sc2code/pickship.c b/sc2/src/sc2code/pickship.c index ecc009baa..eb3b46b65 100644 --- a/sc2/src/sc2code/pickship.c +++ b/sc2/src/sc2code/pickship.c @@ -44,7 +44,7 @@ DoPickBattleShip (PMENU_STATE pMS) pMS->Initialized = TRUE; pMS->InputFunc = DoPickBattleShip; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); goto ChangeSelection; } @@ -84,7 +84,7 @@ DoPickBattleShip (PMENU_STATE pMS) else if (new_row == NUM_PICK_SHIP_ROWS) new_row = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); #ifdef NEVER SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x1D)); @@ -211,7 +211,7 @@ ChangeSelection: SetFlashRect ((RECT *)0, (FRAME)0); SetFlashRect (&pMS->flash_rect0, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -247,11 +247,11 @@ OldContext = SetContext (SpaceContext); MenuState.flash_rect1.corner = pick_r.corner; MenuState.flash_rect1.extent.width = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMenuState = &MenuState; DoInput ((PVOID)&MenuState, TRUE); pMenuState = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); diff --git a/sc2/src/sc2code/planets/cargo.c b/sc2/src/sc2code/planets/cargo.c index b67c55bf8..bf2d1bcf0 100644 --- a/sc2/src/sc2code/planets/cargo.c +++ b/sc2/src/sc2code/planets/cargo.c @@ -69,7 +69,7 @@ DrawCargoStrings (BYTE OldElement, BYTE NewElement) CONTEXT OldContext; UNICODE rt_amount_buf[10]; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (StatusContext); SetContextFont (TinyFont); @@ -272,7 +272,7 @@ DrawCargoStrings (BYTE OldElement, BYTE NewElement) UnbatchGraphics (); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static BOOLEAN @@ -299,9 +299,9 @@ DoDiscardCargo (PMENU_STATE pMS) } else if (cancel) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (DRAW_SIS_DISPLAY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } @@ -312,10 +312,10 @@ DoDiscardCargo (PMENU_STATE pMS) --GLOBAL_SIS (ElementAmounts[pMS->CurState - 1]); DrawCargoStrings ((BYTE)(pMS->CurState - 1), (BYTE)(pMS->CurState - 1)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); --GLOBAL_SIS (TotalElementMass); ShowRemainingCapacity (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } else @@ -336,9 +336,9 @@ DoDiscardCargo (PMENU_STATE pMS) { SelectCargo: DrawCargoStrings ((BYTE)(pMS->CurState - 1), (BYTE)(NewState - 1)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (GAME_STRING (NewState - 1 + (CARGO_STRING_BASE + 2))); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->CurState = NewState; } @@ -354,9 +354,9 @@ Cargo (PMENU_STATE pMS) --pMS->Initialized; pMS->CurState = 1; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage ((UNICODE *)~0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DoInput ((PVOID)pMS, TRUE); diff --git a/sc2/src/sc2code/planets/devices.c b/sc2/src/sc2code/planets/devices.c index 11a94c2dc..5f4110395 100644 --- a/sc2/src/sc2code/planets/devices.c +++ b/sc2/src/sc2code/planets/devices.c @@ -40,7 +40,7 @@ DrawDevices (PMENU_STATE pMS, BYTE OldDevice, BYTE NewDevice) RECT r; PBYTE pDeviceMap; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (StatusContext); SetContextFont (TinyFont); @@ -174,7 +174,7 @@ DrawDevices (PMENU_STATE pMS, BYTE OldDevice, BYTE NewDevice) font_DrawText (&t); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static UWORD @@ -450,7 +450,7 @@ DoManipulateDevices (PMENU_STATE pMS) { UWORD status; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); status = DeviceFailed ( ((PBYTE)pMS->CurFrame)[pMS->CurState - 1] ); @@ -461,7 +461,7 @@ DoManipulateDevices (PMENU_STATE pMS) else if (HIBYTE (status) == 0) PlaySoundEffect (SetAbsSoundIndex (MenuSounds, 3), 0, NotPositional (), NULL, GAME_SOUND_PRIORITY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return ((BOOLEAN)NewState); } @@ -634,9 +634,9 @@ Devices (PMENU_STATE pMS) if (GLOBAL_SIS (CrewEnlisted) != (COUNT)~0 && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (DRAW_SIS_DISPLAY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (!GET_GAME_STATE (PORTAL_COUNTER) && !(GLOBAL (CurrentActivity) & START_ENCOUNTER) diff --git a/sc2/src/sc2code/planets/genchmmr.c b/sc2/src/sc2code/planets/genchmmr.c index 33e90d4ad..9134e74b3 100644 --- a/sc2/src/sc2code/planets/genchmmr.c +++ b/sc2/src/sc2code/planets/genchmmr.c @@ -95,7 +95,7 @@ GenerateChmmr (BYTE control) { RECT r; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pSolarSysState->SysInfo.PlanetInfo.LanderFont = CaptureFont ( @@ -130,7 +130,7 @@ GenerateChmmr (BYTE control) )); pSolarSysState->SysInfo.PlanetInfo.LanderFont = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } default: diff --git a/sc2/src/sc2code/planets/genmyc.c b/sc2/src/sc2code/planets/genmyc.c index a7b2454cc..ecaccb4ea 100644 --- a/sc2/src/sc2code/planets/genmyc.c +++ b/sc2/src/sc2code/planets/genmyc.c @@ -172,9 +172,9 @@ GenerateMycon (BYTE control) break; SET_GAME_STATE (SUN_DEVICE_UNGUARDED, 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } diff --git a/sc2/src/sc2code/planets/genorz.c b/sc2/src/sc2code/planets/genorz.c index 39ebf73de..535e0fe14 100644 --- a/sc2/src/sc2code/planets/genorz.c +++ b/sc2/src/sc2code/planets/genorz.c @@ -333,9 +333,9 @@ GenerateOrz (BYTE control) if (OrzSurvivors) break; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } diff --git a/sc2/src/sc2code/planets/genpet.c b/sc2/src/sc2code/planets/genpet.c index 86a40c1cc..6ff841f07 100644 --- a/sc2/src/sc2code/planets/genpet.c +++ b/sc2/src/sc2code/planets/genpet.c @@ -85,7 +85,7 @@ ZapToUrquanEncounter (void) dx = (SIZE)square_root ((long)dx * dx + (long)dy * dy) + (FUEL_TANK_SCALE >> 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, -dx, 0); if (GLOBAL_SIS (FuelOnBoard) < 5 * FUEL_TANK_SCALE) { @@ -95,7 +95,7 @@ ZapToUrquanEncounter (void) } DrawSISMessage (NULL_PTR); DrawHyperCoords (EncounterPtr->SD.star_pt); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); UnlockEncounter (hEncounter); } diff --git a/sc2/src/sc2code/planets/genthrad.c b/sc2/src/sc2code/planets/genthrad.c index ee4849441..98b604708 100644 --- a/sc2/src/sc2code/planets/genthrad.c +++ b/sc2/src/sc2code/planets/genthrad.c @@ -166,9 +166,9 @@ GenerateThradd (BYTE control) || (!GET_GAME_STATE (HELIX_UNPROTECTED) && (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3)) break; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED diff --git a/sc2/src/sc2code/planets/genutw.c b/sc2/src/sc2code/planets/genutw.c index fd313396d..4fddb2efb 100644 --- a/sc2/src/sc2code/planets/genutw.c +++ b/sc2/src/sc2code/planets/genutw.c @@ -200,9 +200,9 @@ GenerateUtwig (BYTE control) if (DruugeSurvivors) break; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (BOMB_UNPROTECTED, 1); } } diff --git a/sc2/src/sc2code/planets/genvux.c b/sc2/src/sc2code/planets/genvux.c index 46d5a2397..734fb70d5 100644 --- a/sc2/src/sc2code/planets/genvux.c +++ b/sc2/src/sc2code/planets/genvux.c @@ -180,9 +180,9 @@ GenerateVUX (BYTE control) || !GET_GAME_STATE (ZEX_IS_DEAD)) break; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } diff --git a/sc2/src/sc2code/planets/lander.c b/sc2/src/sc2code/planets/lander.c index 868417c92..3c12c15c8 100644 --- a/sc2/src/sc2code/planets/lander.c +++ b/sc2/src/sc2code/planets/lander.c @@ -1215,7 +1215,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); BatchGraphics (); @@ -1329,7 +1329,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) UnbatchGraphics (); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -1353,7 +1353,7 @@ AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide) RepairBackRect (&r); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); #if 0 if (ShowPlanetSide) @@ -1370,7 +1370,7 @@ AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide) SleepThreadUntil (Time + (ONE_SECOND / 22)); Time = GetTimeCounter (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } while (--num_frames); GetFrameRect (s.frame, &r); @@ -1386,9 +1386,9 @@ InitPlanetSide (void) CONTEXT OldContext; DWORD Time; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (RadarContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); Time = GetTimeCounter (); @@ -1397,9 +1397,9 @@ InitPlanetSide (void) s.frame = SetAbsFrameIndex (LanderFrame[0], (ANGLE_TO_FACING (FULL_CIRCLE) << 1) + 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThread (ONE_SECOND / 15); Time = GetTimeCounter (); @@ -1409,10 +1409,10 @@ InitPlanetSide (void) { SleepThreadUntil (Time + ONE_SECOND / 30); Time = GetTimeCounter (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (-1, 0, 0); DeltaLanderCrew (1, 0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } SleepThreadUntil (Time + (ONE_SECOND / 15)); @@ -1423,9 +1423,9 @@ InitPlanetSide (void) else s.frame = SetAbsFrameIndex (s.frame, (ANGLE_TO_FACING (FULL_CIRCLE) << 1) + 2); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (Time + (ONE_SECOND / 15)); Time = GetTimeCounter (); @@ -1436,18 +1436,18 @@ InitPlanetSide (void) { s.frame = SetAbsFrameIndex (s.frame, (ANGLE_TO_FACING (FULL_CIRCLE) << 1) + 3); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (Time + (ONE_SECOND / 15)); Time = GetTimeCounter (); s.frame = IncFrameIndex (s.frame); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (GET_GAME_STATE (IMPROVED_LANDER_CARGO)) { @@ -1455,25 +1455,25 @@ InitPlanetSide (void) Time = GetTimeCounter (); s.frame = SetAbsFrameIndex (s.frame, 59); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } #ifndef SPIN_ON_LAUNCH pSolarSysState->PauseRotate = 1; #endif SleepThreadUntil (Time + (ONE_SECOND / 15)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_DEPARTS), NotPositional (), NULL, GAME_SOUND_PRIORITY + 1); SetContext (SpaceContext); AnimateLaunch (LanderFrame[5], FALSE); #ifdef SPIN_ON_LAUNCH pSolarSysState->PauseRotate = 1; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); #endif // Adjust pSolarSysState->MenuState.first_item by a random jitter. #define RANDOM_MISS 64 @@ -1547,7 +1547,7 @@ InitPlanetSide (void) SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (PLANETARY_LANDING, 1); } @@ -1858,7 +1858,7 @@ ReturnToOrbit (PRECT pRect) { CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); SetContextClipRect (pRect); @@ -1873,7 +1873,7 @@ ReturnToOrbit (PRECT pRect) LoadIntoExtraScreen (pRect); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); // SetPlanetTilt (0); } @@ -1994,9 +1994,9 @@ PlanetSide (PMENU_STATE pMS) #endif /* NEVER */ --GLOBAL_SIS (NumLanders); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawLanders (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ReturnToOrbit (&r); } @@ -2029,7 +2029,7 @@ PlanetSide (PMENU_STATE pMS) SleepThread (1); #endif - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); AnimateLaunch (LanderFrame[6], TRUE); @@ -2047,7 +2047,7 @@ PlanetSide (PMENU_STATE pMS) DrawStorageBays (FALSE); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); GLOBAL_SIS (TotalBioMass) += PSD.BiologicalLevel; } @@ -2090,7 +2090,7 @@ InitLander (BYTE LanderFlags) { RECT r; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (RadarContext); @@ -2182,5 +2182,5 @@ InitLander (BYTE LanderFlags) UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } diff --git a/sc2/src/sc2code/planets/pl_stuff.c b/sc2/src/sc2code/planets/pl_stuff.c index ea8f72c63..48c4bd811 100644 --- a/sc2/src/sc2code/planets/pl_stuff.c +++ b/sc2/src/sc2code/planets/pl_stuff.c @@ -74,7 +74,7 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo dy += ((zoom_from & 0x02) ? 1 : -1) * dy * (base - scale_amt) / base; } - //SetSemaphore (GraphicsSem); + //LockCrossThreadMutex (GraphicsLock); // PauseRotate needs to be checked twice. It is first // checked at the rotate_planet_task function to bypass @@ -82,7 +82,7 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo // parts of te code. It is checked here because it is possile // that PauseRotate was set between then and now, and we don't // want too push anything onto the DrawQueue in that case. - // If the setSemaphore is moved before the RenderLevelMasks call, + // If the LockCrossThreadMutex is moved before the RenderLevelMasks call, // one of the two PauseRotate checks can be removed. //if (((PSOLARSYS_STATE volatile)pSolarSysState)->PauseRotate !=1) { @@ -103,7 +103,7 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo UnbatchGraphics (); SetContext (OldContext); } - //ClearSemaphore (GraphicsSem); + //UnlockCrossThreadMutex (GraphicsLock); if (scale_amt && scale_amt != base) { GetFrameRect (pFrame[num_frames - 1], zoomr); diff --git a/sc2/src/sc2code/planets/planets.c b/sc2/src/sc2code/planets/planets.c index 9c82173b5..4338a5089 100644 --- a/sc2/src/sc2code/planets/planets.c +++ b/sc2/src/sc2code/planets/planets.c @@ -61,7 +61,7 @@ void LoadPlanet (BOOLEAN IsDefined) { STAMP s; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); SetTransitionSource (NULL); @@ -106,9 +106,9 @@ LoadPlanet (BOOLEAN IsDefined) { if (LOBYTE (LastActivity) == 0) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } else { @@ -146,7 +146,7 @@ LoadPlanet (BOOLEAN IsDefined) LoadIntoExtraScreen (&r); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (!PLRPlaying ((MUSIC_REF)~0)) { @@ -173,7 +173,7 @@ LoadPlanet (BOOLEAN IsDefined) r.corner.y = SIS_ORG_Y; r.extent.width = SIS_SCREEN_WIDTH; r.extent.height = SIS_SCREEN_HEIGHT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); oldContext = SetContext (SpaceContext); DrawStarBackGround (TRUE); SetContext (oldContext); @@ -183,7 +183,7 @@ LoadPlanet (BOOLEAN IsDefined) ScreenTransition (3, &r); // How does this work? UnbatchGraphics (); LoadIntoExtraScreen (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -201,7 +201,7 @@ FreePlanet (void) } StopMusic (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); for (i = 0; i < sizeof (pSolarSysState->PlanetSideFrame) / sizeof (pSolarSysState->PlanetSideFrame[0]); ++i) @@ -253,6 +253,6 @@ FreePlanet (void) pSolarSysState->SysInfo.PlanetInfo.LanderFont = 0; pSolarSysState->PauseRotate = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } diff --git a/sc2/src/sc2code/planets/plangen.c b/sc2/src/sc2code/planets/plangen.c index 52b3d2f8e..12593b2a8 100644 --- a/sc2/src/sc2code/planets/plangen.c +++ b/sc2/src/sc2code/planets/plangen.c @@ -1411,14 +1411,14 @@ rotate_planet_task (void *data) view_index = MAP_WIDTH; do { - // This SetSemaphore was placed before the RotatePlanet call + // This lock was placed before the RotatePlanet call // To prevent the thread from being interrupted by the flash // task while computing the Planet Frame. This should help // to smooth out the planet rotation animation. - // The PauseRotate needs to be placed after the SetSemaphore, - // to gaurantee that PauseRotate doesn't change while waiting - // to aquire the GraphicsSem - SetSemaphore (GraphicsSem); + // The PauseRotate needs to be placed after the lock, + // to guarantee that PauseRotate doesn't change while waiting + // to acquire the graphics lock + LockCrossThreadMutex (GraphicsLock); if (*(volatile UBYTE *)&pSS->PauseRotate !=1 // if (((PSOLARSYS_STATE volatile)pSS)->MenuState.Initialized <= 3 && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) @@ -1441,7 +1441,7 @@ rotate_planet_task (void *data) } else view_index++; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); // If this frame hasn't been generted, generate it if (! pSolarSysState->Orbit.isPFADefined[x]) { RenderLevelMasks (x); diff --git a/sc2/src/sc2code/planets/pstarmap.c b/sc2/src/sc2code/planets/pstarmap.c index efe5c0b33..5375f01fa 100644 --- a/sc2/src/sc2code/planets/pstarmap.c +++ b/sc2/src/sc2code/planets/pstarmap.c @@ -73,7 +73,7 @@ flash_cursor_func(void *data) CONTEXT OldContext; TimeIn = GetTimeCounter (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); if (c == 0x00 || c == 0x1A) @@ -86,7 +86,7 @@ flash_cursor_func(void *data) SetContextForeGroundColor (OldColor); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + (ONE_SECOND >> 4)); } FinishTask (task); @@ -254,7 +254,7 @@ DrawStarMap (COUNT race_update, PRECT pClipRect) } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); draw_cursor = TRUE; } @@ -528,7 +528,7 @@ wprintf ("%s\n", buf); } if (draw_cursor) - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -558,9 +558,9 @@ EraseCursor (COORD curs_x, COORD curs_y) #else /* NEW */ r.extent.height += r.corner.y & 1; r.corner.y &= ~1; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawStarMap (0, &r); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); #endif /* OLD */ } @@ -730,11 +730,11 @@ DoMoveCursor (PMENU_STATE pMS) } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); EraseCursor (pt.x, pt.y); // ClearDrawable (); DrawCursor (s.origin.x, s.origin.y); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } UpdateCursorInfo: @@ -798,7 +798,7 @@ UpdateCursorInfo: fuel_required = 0; else fuel_required = square_root (f) + (FUEL_TANK_SCALE >> 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawHyperCoords (pMenuState->first_item); if (last_buf == (UNICODE) ~0 || (buf[0] && !last_buf) || (!buf[0] && last_buf)) @@ -811,7 +811,7 @@ UpdateCursorInfo: fuel_required / FUEL_TANK_SCALE, (fuel_required % FUEL_TANK_SCALE) / 10); DrawStatusMessage (buf); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } @@ -1106,7 +1106,7 @@ DoStarMap (void) if (MenuState.first_item.x == ~0 && MenuState.first_item.y == ~0) MenuState.first_item = universe; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); MenuState.InputFunc = DoMoveCursor; @@ -1117,7 +1117,7 @@ DoStarMap (void) if (GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1) UpdateMap (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStarMap (0, (PRECT)-1); transition_pending = FALSE; @@ -1132,7 +1132,7 @@ DoStarMap (void) UNIVERSE_TO_DISPY (pMenuState->first_item.y) ); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); OldMenuSounds = MenuSounds; MenuSounds = 0; @@ -1142,7 +1142,7 @@ DoStarMap (void) pMenuState = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawHyperCoords (universe); DrawSISMessage (NULL_PTR); @@ -1166,7 +1166,7 @@ DoFlagshipCommands (PMENU_STATE pMS) else { BOOLEAN select = CurrentMenuState.select; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); while (*(volatile BYTE *)&pMS->CurState == 0 && (*(volatile SIZE *)&pMS->Initialized & 1) && !(GLOBAL (CurrentActivity) @@ -1174,11 +1174,11 @@ DoFlagshipCommands (PMENU_STATE pMS) | CHECK_ABORT | CHECK_LOAD)) && GLOBAL_SIS (CrewEnlisted) != (COUNT)~0) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (pMS->CurState) { @@ -1199,9 +1199,9 @@ DoFlagshipCommands (PMENU_STATE pMS) { if (NewState != SCAN + 1 && NewState != (GAME_MENU) + 1) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } switch (NewState - 1) @@ -1247,7 +1247,7 @@ DoFlagshipCommands (PMENU_STATE pMS) { BOOLEAN AutoPilotSet; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (++pMS->Initialized > 3) { pSolarSysState->PauseRotate = 1; RepairSISBorder (); @@ -1258,7 +1258,7 @@ DoFlagshipCommands (PMENU_STATE pMS) if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE || (GLOBAL (CurrentActivity) & CHECK_ABORT)) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } else if (pMS->Initialized <= 3) @@ -1266,16 +1266,16 @@ DoFlagshipCommands (PMENU_STATE pMS) ZoomSystem (); --pMS->Initialized; } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (!AutoPilotSet && pMS->Initialized >= 3) { LoadPlanet (FALSE); --pMS->Initialized; pSolarSysState->PauseRotate = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } } @@ -1291,17 +1291,17 @@ DoFlagshipCommands (PMENU_STATE pMS) else if (pMS->flash_task) { FreePlanet (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); LoadSolarSys (); ValidateOrbits (); ZoomSystem (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pMS->CurState = 0; FlushInput (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } @@ -1309,9 +1309,9 @@ DoFlagshipCommands (PMENU_STATE pMS) ; else if (pMS->CurState) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (select) { if (optWhichMenu != OPT_PC) @@ -1322,9 +1322,9 @@ DoFlagshipCommands (PMENU_STATE pMS) } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_STARMAP, -NAVIGATION); } } diff --git a/sc2/src/sc2code/planets/report.c b/sc2/src/sc2code/planets/report.c index ee47cd463..b2fe93871 100644 --- a/sc2/src/sc2code/planets/report.c +++ b/sc2/src/sc2code/planets/report.c @@ -94,7 +94,7 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) last_c = *pStr; Sleepy = TRUE; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); goto InitPageCell; @@ -148,9 +148,9 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) font_DrawText (&t); else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); PlaySound (ReadOutSounds, NotPositional (), NULL, GAME_SOUND_PRIORITY); @@ -174,7 +174,7 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) else if (AnyButtonPress (TRUE)) { Sleepy = FALSE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); break; } @@ -198,7 +198,7 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) if (!Sleepy) { UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } if (WaitAnyButtonOrQuit (TRUE)) @@ -210,17 +210,17 @@ InitPageCell: row_cells = 0; if (StrLen) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!Sleepy) BatchGraphics (); ClearReportArea(); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0, 0x1F, 0), 0xFF)); if (Sleepy) - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } void @@ -268,11 +268,11 @@ DoDiscoveryReport (SOUND ReadOutSounds) #endif /* OLD */ SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); while (AnyButtonPress (TRUE)) TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (pMenuState) pMenuState->flash_rect0.corner = old_curs; diff --git a/sc2/src/sc2code/planets/roster.c b/sc2/src/sc2code/planets/roster.c index 7cc8f914f..64a745ffa 100644 --- a/sc2/src/sc2code/planets/roster.c +++ b/sc2/src/sc2code/planets/roster.c @@ -35,7 +35,7 @@ flash_ship_task(void *data) COLOR OldColor; CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); s.origin = pMenuState->first_item; StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( &GLOBAL (built_ship_q), @@ -55,7 +55,7 @@ flash_ship_task(void *data) DrawFilledStamp (&s); SetContextForeGroundColor (OldColor); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + ONE_SECOND / 15); TimeIn = GetTimeCounter (); } @@ -212,9 +212,9 @@ DoModifyRoster (PMENU_STATE pMS) if (GLOBAL (CurrentActivity) & CHECK_ABORT) { pMS->CurFrame = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RosterCleanup (pMS); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } @@ -231,24 +231,24 @@ DoModifyRoster (PMENU_STATE pMS) pMS->Initialized = TRUE; pMS->CurState = NewState = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (StatusContext); goto SelectSupport; } else if (cancel && !(pMS->CurState & SHIP_TOGGLE)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); RosterCleanup (pMS); pMS->CurFrame = 0; DrawStatusMessage (NULL_PTR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } else if (select || cancel) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pMS->CurState ^= SHIP_TOGGLE; if (!(pMS->CurState & SHIP_TOGGLE)) SetFlashRect (NULL_PTR, (FRAME)0); @@ -263,7 +263,7 @@ DoModifyRoster (PMENU_STATE pMS) SetContext (StatusContext); SetFlashRect (&r, (FRAME)0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (pMS->CurState & SHIP_TOGGLE) { @@ -272,9 +272,9 @@ DoModifyRoster (PMENU_STATE pMS) sy = -1; if (GLOBAL_SIS (CrewEnlisted)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSupportCrew (1); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } else if (down) @@ -283,9 +283,9 @@ DoModifyRoster (PMENU_STATE pMS) if (GLOBAL_SIS (CrewEnlisted) < GetCPodCapacity (NULL_PTR)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSupportCrew (-1); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } @@ -335,7 +335,7 @@ DoModifyRoster (PMENU_STATE pMS) if (NewState != pMS->CurState) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (StatusContext); s.origin = pMS->first_item; StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( @@ -354,7 +354,7 @@ SelectSupport: pMS->CurFrame = (FRAME)MatchSupportShip (pMS); DeltaSupportCrew (0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->CurState = NewState; } diff --git a/sc2/src/sc2code/planets/scan.c b/sc2/src/sc2code/planets/scan.c index ffbd2f6ce..43c2064fe 100644 --- a/sc2/src/sc2code/planets/scan.c +++ b/sc2/src/sc2code/planets/scan.c @@ -68,7 +68,7 @@ EraseCoarseScan (void) const int leftScanOffset = 5; const int rightScanOffset = 50; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); r.corner.x = (SIS_SCREEN_WIDTH >> 1) - (160 >> 1); @@ -88,7 +88,7 @@ EraseCoarseScan (void) r.extent.width = rightScanWidth; RepairBackRect (&r); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -113,7 +113,7 @@ PrintCoarseScanPC (void) RECT r; UNICODE buf[40]; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); if (CurStarDescPtr->Index == SOL_DEFINED) @@ -176,7 +176,7 @@ PrintCoarseScanPC (void) SetContextFont (MicroFont); font_DrawText (&t); SetContextFont (TinyFont); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); #define LEFT_SIDE_BASELINE_X_PC 5 #define RIGHT_SIDE_BASELINE_X_PC (SIS_SCREEN_WIDTH - 75) @@ -185,7 +185,7 @@ PrintCoarseScanPC (void) t.baseline.y = SCAN_BASELINE_Y_PC; t.align = ALIGN_LEFT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Orbit: ", LEFT_SIDE_BASELINE_X_PC); temp = (SIZE)((pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist * 100L @@ -197,9 +197,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Atmo: ", LEFT_SIDE_BASELINE_X_PC); if (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity == GAS_GIANT_ATMOSPHERE) @@ -218,18 +218,18 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Temp: ", LEFT_SIDE_BASELINE_X_PC); wsprintf (buf, "%d^ c", pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature); t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Weather: ", LEFT_SIDE_BASELINE_X_PC); if (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity == 0) @@ -239,9 +239,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Tectonics: ", LEFT_SIDE_BASELINE_X_PC); if (PLANSIZE (pSolarSysState->SysInfo.PlanetInfo.PlanDataPtr->Type) == GAS_GIANT) @@ -250,11 +250,11 @@ PrintCoarseScanPC (void) wsprintf (buf, "Class %u", pSolarSysState->SysInfo.PlanetInfo.Tectonics + 1); t.CharCount = (COUNT)~0; font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); t.baseline.y = SCAN_BASELINE_Y_PC; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Mass: ", RIGHT_SIDE_BASELINE_X_PC); { @@ -274,9 +274,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Radius: ", RIGHT_SIDE_BASELINE_X_PC); if ((temp = pSolarSysState->SysInfo.PlanetInfo.PlanetRadius) >= 10 * 100) @@ -286,9 +286,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Gravity: ", RIGHT_SIDE_BASELINE_X_PC); if ((temp = pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity) >= 10 * 100) @@ -302,9 +302,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Day: ", RIGHT_SIDE_BASELINE_X_PC); if (pSolarSysState->SysInfo.PlanetInfo.RotationPeriod < 240 * 10) @@ -321,9 +321,9 @@ PrintCoarseScanPC (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING_PC; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; PrintScanTitlePC (&t, &r, "Tilt: ", RIGHT_SIDE_BASELINE_X_PC); if ((temp = pSolarSysState->SysInfo.PlanetInfo.AxialTilt) < 0) @@ -331,7 +331,7 @@ PrintCoarseScanPC (void) wsprintf (buf, "%u^", temp); t.CharCount = (COUNT)~0; font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -344,7 +344,7 @@ PrintCoarseScan3DO (void) UNICODE buf[40]; extern FRAME SpaceJunkFrame; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); if (CurStarDescPtr->Index == SOL_DEFINED) @@ -411,7 +411,7 @@ PrintCoarseScan3DO (void) s.frame = SetAbsFrameIndex (SpaceJunkFrame, 20); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); #define LEFT_SIDE_BASELINE_X (27 + (16 - SAFE_X)) #define RIGHT_SIDE_BASELINE_X (SIS_SCREEN_WIDTH - LEFT_SIDE_BASELINE_X) @@ -421,7 +421,7 @@ PrintCoarseScan3DO (void) t.baseline.y = SCAN_BASELINE_Y; t.align = ALIGN_LEFT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; temp = (SIZE)((pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist * 100L + (EARTH_RADIUS >> 1)) / EARTH_RADIUS); @@ -432,9 +432,9 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; if (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity == GAS_GIANT_ATMOSPHERE) wsprintf (buf, "\x7f"); @@ -450,26 +450,26 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; wsprintf (buf, "%d^", pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature); t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; wsprintf (buf, "<%u>", pSolarSysState->SysInfo.PlanetInfo.AtmoDensity == 0 ? 0 : (pSolarSysState->SysInfo.PlanetInfo.Weather + 1)); t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; wsprintf (buf, "<%u>", PLANSIZE ( @@ -478,13 +478,13 @@ PrintCoarseScan3DO (void) ? 0 : (pSolarSysState->SysInfo.PlanetInfo.Tectonics + 1)); t.CharCount = (COUNT)~0; font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); t.baseline.x = RIGHT_SIDE_BASELINE_X; t.baseline.y = SCAN_BASELINE_Y; t.align = ALIGN_RIGHT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; { DWORD tr; @@ -503,9 +503,9 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; if ((temp = pSolarSysState->SysInfo.PlanetInfo.PlanetRadius) >= 10 * 100) wsprintf (buf, "%u.%u&", temp / 100, (temp / 10) % 10); @@ -514,9 +514,9 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; if ((temp = pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity) >= 10 * 100) wsprintf (buf, "%u.%u&", temp / 100, (temp / 10) % 10); @@ -529,9 +529,9 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; if ((temp = pSolarSysState->SysInfo.PlanetInfo.AxialTilt) < 0) temp = -temp; @@ -539,9 +539,9 @@ PrintCoarseScan3DO (void) t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += SCAN_LEADING; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); t.pStr = buf; if (pSolarSysState->SysInfo.PlanetInfo.RotationPeriod < 240 * 10) { @@ -556,7 +556,7 @@ PrintCoarseScan3DO (void) } t.CharCount = (COUNT)~0; font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -569,7 +569,7 @@ SetPlanetLoc (POINT new_pt) new_pt.x >>= MAG_SHIFT; new_pt.y >>= MAG_SHIFT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScanContext); s.origin.x = pMenuState->flash_rect0.corner.x - (FLASH_WIDTH >> 1); s.origin.y = pMenuState->flash_rect0.corner.y - (FLASH_HEIGHT >> 1); @@ -583,7 +583,7 @@ SetPlanetLoc (POINT new_pt) r.extent.width = FLASH_WIDTH; r.extent.height = FLASH_HEIGHT; LoadDisplayPixmap (&r, pMenuState->flash_frame0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); } @@ -609,7 +609,7 @@ flash_planet_loc_func(void *data) DWORD T; CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); T = GetTimeCounter (); if (p.Object.Stamp.origin.x != pMenuState->flash_rect0.corner.x || p.Object.Stamp.origin.y != pMenuState->flash_rect0.corner.y) @@ -621,7 +621,7 @@ flash_planet_loc_func(void *data) { if (T < TimeIn) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); continue; @@ -639,7 +639,7 @@ flash_planet_loc_func(void *data) SetContext (OldContext); TimeIn = T + (ONE_SECOND >> 4); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); } @@ -680,7 +680,7 @@ PickPlanetSide (PMENU_STATE pMS) pMS->Initialized = TRUE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScanContext); pMenuState->flash_rect0.corner.x = pSolarSysState->MenuState.first_item.x >> MAG_SHIFT; @@ -694,7 +694,7 @@ PickPlanetSide (PMENU_STATE pMS) LoadDisplayPixmap (&r, pMenuState->flash_frame0); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); InitLander (0); @@ -709,9 +709,9 @@ PickPlanetSide (PMENU_STATE pMS) MenuSounds = (SOUND)pMS->CurFrame; pMS->CurFrame = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (NULL_PTR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); FlushInput (); if (pMenuState->flash_task) @@ -735,13 +735,13 @@ PickPlanetSide (PMENU_STATE pMS) EraseCoarseScan (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (0, -(SIZE)fuel_required, 0); SetContext (ScanContext); s.origin = pMenuState->flash_rect0.corner; s.frame = SetAbsFrameIndex (misc_data, FLASH_INDEX); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); PlanetSide (pMS); if (GLOBAL (CurrentActivity) & CHECK_ABORT) @@ -796,9 +796,9 @@ PickPlanetSide (PMENU_STATE pMS) } DrawMenuStateStrings (PM_MIN_SCAN, DISPATCH_SHUTTLE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ExitPlanetSide: if (pMS->CurFrame) @@ -962,12 +962,12 @@ DoScan (PMENU_STATE pMS) } else if (cancel || (select && pMS->CurState == EXIT_SCAN)) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); BatchGraphics (); DrawPlanet (SIS_SCREEN_WIDTH - MAP_WIDTH, SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, 0); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); EraseCoarseScan (); // DrawMenuStateStrings (PM_SCAN, SCAN); @@ -1004,18 +1004,18 @@ DoScan (PMENU_STATE pMS) GAME_STRING (NAVIGATION_STRING_BASE + 5), fuel_required / FUEL_TANK_SCALE, ((fuel_required % FUEL_TANK_SCALE) + 5) / 10); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (CLEAR_SIS_RADAR); DrawStatusMessage (buf); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScanContext); BatchGraphics (); DrawPlanet (0, 0, 0, 0); DrawScannedObjects (FALSE); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->Initialized = FALSE; pMS->CurFrame = 0; @@ -1048,7 +1048,7 @@ DoScan (PMENU_STATE pMS) pMS->delta_item = (SIZE)pSolarSysState->CurNode; t.pStr = GAME_STRING (SCAN_STRING_BASE + min_scan); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); r.corner.x = 0; r.corner.y = t.baseline.y - 10; @@ -1078,7 +1078,7 @@ DoScan (PMENU_STATE pMS) font_DrawText (&t); SetContext (ScanContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); { DWORD rgb; @@ -1096,15 +1096,15 @@ DoScan (PMENU_STATE pMS) break; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); DrawPlanet (0, 0, 0, 0); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); PressState = AnyButtonPress (TRUE); WaitTime = (ONE_SECOND << 1) / MAP_HEIGHT; -// SetSemaphore (GraphicsSem); +// LockCrossThreadMutex (GraphicsLock); TimeIn = GetTimeCounter (); for (i = 0; i < MAP_HEIGHT + NUM_FLASH_COLORS + 1; i++) { @@ -1116,7 +1116,7 @@ DoScan (PMENU_STATE pMS) } if (ButtonState) i = -i; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); DrawPlanet (0, 0, i, rgb); if (i < 0) @@ -1124,19 +1124,19 @@ DoScan (PMENU_STATE pMS) if (pMS->delta_item) DrawScannedStuff (i, min_scan); UnbatchGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); // FlushGraphics (); SleepThreadUntil (TimeIn + WaitTime); TimeIn = GetTimeCounter (); } -// ClearSemaphore (GraphicsSem); +// UnlockCrossThreadMutex (GraphicsLock); pSolarSysState->Tint_rgb = 0; } } while (++min_scan <= max_scan); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); r.corner.x = 0; r.corner.y = (SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7) - 10; @@ -1149,12 +1149,12 @@ DoScan (PMENU_STATE pMS) { DrawPlanet (0, 0, 0, 0); DrawScannedObjects (FALSE); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState = DISPATCH_SHUTTLE); } else - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pSolarSysState->MenuState.Initialized -= 4; pSolarSysState->PauseRotate = 0; @@ -1208,7 +1208,7 @@ ScanSystem (void) pSolarSysState->MenuState.first_item.x = (MAP_WIDTH >> 1) << MAG_SHIFT; pSolarSysState->MenuState.first_item.y = (MAP_HEIGHT >> 1) << MAG_SHIFT; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ScanContext = CaptureContext (CreateContext ()); SetContext (ScanContext); MenuState.flash_rect0.extent.width = FLASH_WIDTH; @@ -1224,7 +1224,7 @@ ScanSystem (void) r.extent.height = MAP_HEIGHT; SetContextClipRect (&r); DrawScannedObjects (FALSE); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } DrawMenuStateStrings (PM_MIN_SCAN, MenuState.CurState); @@ -1240,12 +1240,12 @@ ScanSystem (void) if (ScanContext) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); DestroyDrawable (ReleaseDrawable (MenuState.flash_frame0)); DestroyContext (ReleaseContext (ScanContext)); ScanContext = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } diff --git a/sc2/src/sc2code/planets/solarsys.c b/sc2/src/sc2code/planets/solarsys.c index 055d6f62b..e86bd5a4d 100644 --- a/sc2/src/sc2code/planets/solarsys.c +++ b/sc2/src/sc2code/planets/solarsys.c @@ -339,18 +339,18 @@ FreeSolarSys (void) { ConcludeTask (pSolarSysState->MenuState.flash_task); pSolarSysState->MenuState.flash_task = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))) { extern void SaveFlagshipState (void); SaveFlagshipState (); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); @@ -358,7 +358,7 @@ FreeSolarSys (void) // FreeIPData (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } static void @@ -1024,7 +1024,7 @@ int IPtask_func(void* data) RECT r; InnerSystem = FALSE; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); while ((pSolarSysState->MenuState.Initialized > 1 || (GLOBAL (CurrentActivity) & (START_ENCOUNTER | END_INTERPLANETARY @@ -1033,15 +1033,15 @@ int IPtask_func(void* data) && !Task_ReadState (task, TASK_EXIT)) { select = cancel = FALSE; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); NextTime = GetTimeCounter (); } if (Task_ReadState (task, TASK_EXIT)) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); break; } @@ -1163,7 +1163,7 @@ TheMess: } SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (Task_ReadState (task, TASK_EXIT)) { @@ -1190,20 +1190,20 @@ TheMess: MenuTransition = DEBOUNCE_DELAY; SuspendGameClock (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStatusMessage (NULL_PTR); if (LastActivity == CHECK_LOAD) pSolarSysState->MenuState.CurState = (ROSTER + 1) + 1; else { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_STARMAP, STARMAP); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pSolarSysState->MenuState.CurState = STARMAP + 1; } SetFlashRect ((PRECT)~0L, (FRAME)0); FlushInput (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } FinishTask (task); @@ -1213,10 +1213,10 @@ TheMess: static void DrawInnerSystem (void) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISTitle (GLOBAL_SIS (PlanetName)); DrawSystem (pSolarSysState->pBaseDesc->pPrevDesc->radius, TRUE); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } BOOLEAN @@ -1276,7 +1276,7 @@ StartGroups: { DrawMenuStateStrings (PM_STARMAP, -(PM_NAVIGATE - PM_SCAN)); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); RepairSISBorder (); InitDisplayList (); @@ -1293,7 +1293,7 @@ StartGroups: pSolarSysState->MenuState.flash_task = AssignTask (IPtask_func, 6144, "flash solar system menu"); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (!PLRPlaying ((MUSIC_REF)~0) && LastActivity != CHECK_LOAD) { @@ -1308,14 +1308,14 @@ StartGroups: draw_sys_flags &= ~UNBATCH_SYS; UnbatchGraphics (); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); while (pSolarSysState->SunDesc[0].radius == (MAX_ZOOM_RADIUS << 1)) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); XFormColorMap ((COLORMAPPTR)clut_buf, ONE_SECOND / 2); } } @@ -1368,11 +1368,11 @@ StartGroups: else { DrawMenuStateStrings (PM_SCAN, SCAN); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); pSolarSysState->MenuState.CurState = SCAN + 1; SetFlashRect ((PRECT)~0L, (FRAME)0); FlushInput (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } @@ -1383,11 +1383,11 @@ InitSolarSys (void) BOOLEAN InnerSystem; BOOLEAN Reentry; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); LoadIPData (); LoadLanderData (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pSolarSysState->MenuState.InputFunc = DoFlagshipCommands; @@ -1440,23 +1440,23 @@ InitSolarSys (void) } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); ClearSISRect (DRAW_SIS_DISPLAY); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); LastActivity &= ~CHECK_LOAD; } } - // Enabled SetSemaphore and ClearSemaphore again, as in 3DO code originally. + // Enabled graphics synchronization again, as in 3DO code originally. // This should fix the 'entering star' lockup/messed graphics problems. // 2002/11/30 by Mika - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISMessage (NULL_PTR); SetContext (SpaceContext); SetContextFGFrame (Screen); SetContextBackGroundColor (BLACK_COLOR); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (InnerSystem) { @@ -1473,9 +1473,9 @@ InitSolarSys (void) } else { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawHyperCoords (CurStarDescPtr->star_pt); /* Adjust position */ - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); /* force a redraw */ pSolarSysState->SunDesc[0].radius = MAX_ZOOM_RADIUS << 1; diff --git a/sc2/src/sc2code/restart.c b/sc2/src/sc2code/restart.c index ff009257f..4c084cd3b 100644 --- a/sc2/src/sc2code/restart.c +++ b/sc2/src/sc2code/restart.c @@ -53,7 +53,7 @@ DrawRestartMenu (BYTE OldState, BYTE NewState, FRAME f) TEXT t; UNICODE buf[64]; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (ScreenContext); r.corner.x = r.corner.y = r.extent.width = r.extent.height = 0; SetContextClipRect (&r); @@ -76,7 +76,7 @@ DrawRestartMenu (BYTE OldState, BYTE NewState, FRAME f) SetContextForeGroundColor (WHITE_COLOR); font_DrawText (&t); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); (void) OldState; /* Satisfying compiler (unused parameter) */ } @@ -155,9 +155,9 @@ else if (InputState & DEVICE_EXIT) return (FALSE); break; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } @@ -282,18 +282,18 @@ LastActivity = WON_LAST_BATTLE; BatchGraphics (); ClearDrawable (); FlushColorXForms (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); UnbatchGraphics (); FlushInput (); GLOBAL (CurrentActivity) &= ~CHECK_ABORT; DoInput ((PVOID)&MenuState, TRUE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)0, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DestroyDrawable (ReleaseDrawable (s.frame)); if (GLOBAL (CurrentActivity) == (ACTIVITY)~0) diff --git a/sc2/src/sc2code/save.c b/sc2/src/sc2code/save.c index 490bde5a8..ac69a55a4 100644 --- a/sc2/src/sc2code/save.c +++ b/sc2/src/sc2code/save.c @@ -209,11 +209,11 @@ SaveProblem (void) STAMP s; CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (SpaceContext); SaveProblemMessage (&s); FlushGraphics (); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); while (AnyButtonPress (FALSE)); do @@ -223,13 +223,13 @@ SaveProblem (void) } while (!(CurrentMenuState.select || CurrentMenuState.special || (GLOBAL (CurrentActivity) & CHECK_ABORT))); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); BatchGraphics (); DrawStamp (&s); UnbatchGraphics (); SetContext (OldContext); DestroyDrawable (ReleaseDrawable (s.frame)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return; } diff --git a/sc2/src/sc2code/setup.c b/sc2/src/sc2code/setup.c index 6f8dc73a6..9cf0a9cf6 100644 --- a/sc2/src/sc2code/setup.c +++ b/sc2/src/sc2code/setup.c @@ -47,7 +47,7 @@ FONT StarConFont, MicroFont, TinyFont; QUEUE race_q[NUM_PLAYERS]; SOUND MenuSounds, GameSounds; FRAME ActivityFrame, status, flagship_status, misc_data; -Semaphore GraphicsSem; +CrossThreadMutex GraphicsLock; CondVar RenderingCond; STRING GameStrings; diff --git a/sc2/src/sc2code/ship.c b/sc2/src/sc2code/ship.c index 8babd7e7e..9df5f2b7e 100644 --- a/sc2/src/sc2code/ship.c +++ b/sc2/src/sc2code/ship.c @@ -200,10 +200,10 @@ ship_preprocess (PELEMENT ElementPtr) InitIntersectStartPoint (ElementPtr); InitIntersectEndPoint (ElementPtr); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ResumeGameClock (); SetGameClockRate (HYPERSPACE_CLOCK_RATE); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); if (hyper_transition (ElementPtr)) return; diff --git a/sc2/src/sc2code/shipyard.c b/sc2/src/sc2code/shipyard.c index 44a4daa44..c3798a3ae 100644 --- a/sc2/src/sc2code/shipyard.c +++ b/sc2/src/sc2code/shipyard.c @@ -92,7 +92,7 @@ int hangar_anim_func (void* data) CONTEXT OldContext; RECT OldClipRect; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (ScreenContext); GetContextClipRect (&OldClipRect); SetContextClipRect (&ClipRect); @@ -103,7 +103,7 @@ int hangar_anim_func (void* data) SetContextClipRect (&OldClipRect); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + ONE_SECOND / HANGAR_ANIM_RATE); TimeIn = GetTimeCounter (); @@ -207,7 +207,7 @@ DrawRaceStrings (BYTE NewRaceItem) STAMP s; CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (StatusContext); GetContextClipRect (&r); @@ -272,7 +272,7 @@ DrawRaceStrings (BYTE NewRaceItem) } //SetFlashRect ((PRECT)~0L, (FRAME)0); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } #define SHIP_WIN_WIDTH 34 @@ -497,7 +497,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr) while (AnyButtonPress (FALSE)) TaskSwitch(); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (OffScreenContext); SetContextFGFrame (Screen); SetContextBackGroundColor (BLACK_COLOR); @@ -541,7 +541,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr) UnbatchGraphics (); SetContextClipRect (NULL_PTR); SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } } @@ -571,9 +571,9 @@ CrewTransaction (SIZE crew_delta) { GLOBAL (CrewCost) += 2; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_CREW, SHIPYARD_CREW); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } else @@ -583,9 +583,9 @@ CrewTransaction (SIZE crew_delta) { GLOBAL (CrewCost) -= 2; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_CREW, SHIPYARD_CREW); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } if (!(ActivateStarShip ( @@ -634,7 +634,7 @@ DoModifyShips (PMENU_STATE pMS) pMS->CurState = MAKE_BYTE (0, 0xF); pMS->delta_item = 0; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); goto ChangeFlashRect; } @@ -710,7 +710,7 @@ DoModifyShips (PMENU_STATE pMS) ); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); #ifdef WANT_SHIP_SPINS if (special) @@ -745,7 +745,7 @@ DoModifyShips (PMENU_STATE pMS) COUNT Index; // SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); if (!(pMS->delta_item & MODIFY_CREW_FLAG)) { pMS->delta_item = MODIFY_CREW_FLAG; @@ -771,12 +771,12 @@ DoModifyShips (PMENU_STATE pMS) { ShowCombatShip ((COUNT)pMS->CurState, (SHIP_FRAGMENTPTR)0); //Reset flash rectangle - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings (PM_CREW, SHIPYARD_CREW); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DeltaSISGauges (UNDEFINED_DELTA, UNDEFINED_DELTA, -((int)ShipCost[Index])); r.corner.x = pMS->flash_rect0.corner.x; @@ -786,7 +786,7 @@ DoModifyShips (PMENU_STATE pMS) r.extent.height = 5; SetContext (SpaceContext); SetFlashRect (&r, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } return (TRUE); @@ -814,7 +814,7 @@ DoModifyShips (PMENU_STATE pMS) return (TRUE); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); goto ChangeFlashRect; } else if (select || cancel) @@ -824,9 +824,9 @@ DoModifyShips (PMENU_STATE pMS) && StarShipPtr->ShipInfo.crew_level == 0) { SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ShowCombatShip ((COUNT)pMS->CurState, StarShipPtr); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); RemoveQueue (&GLOBAL (built_ship_q), hStarShip); FreeStarShip (&GLOBAL (built_ship_q), hStarShip); @@ -998,13 +998,13 @@ DoModifyShips (PMENU_STATE pMS) } else if (cancel) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->InputFunc = DoShipyard; DrawMenuStateStrings (PM_CREW, pMS->CurState = SHIPYARD_CREW); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (TRUE); } @@ -1031,7 +1031,7 @@ ChangeFlashRect: } SetFlashRect (&pMS->flash_rect0, (FRAME)0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } @@ -1044,7 +1044,7 @@ DrawBluePrint (PMENU_STATE pMS) COUNT num_frames; STAMP s; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); pMS->ModuleFrame = CaptureDrawable ( @@ -1155,7 +1155,7 @@ DrawBluePrint (PMENU_STATE pMS) DestroyDrawable (ReleaseDrawable (pMS->ModuleFrame)); pMS->ModuleFrame = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } void @@ -1220,16 +1220,16 @@ DoShipyard (PMENU_STATE pMS) BatchGraphics (); DrawSISFrame (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawSISMessage (GAME_STRING (STARBASE_STRING_BASE + 3)); DrawSISTitle (GAME_STRING (STARBASE_STRING_BASE)); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawBluePrint (pMS); pMS->ModuleFrame = s.frame; DrawMenuStateStrings (PM_CREW, pMS->CurState = SHIPYARD_CREW); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetContext (SpaceContext); s.origin.x = s.origin.y = 0; #ifdef USE_3DO_HANGAR @@ -1261,12 +1261,12 @@ DoShipyard (PMENU_STATE pMS) PlayMusic (pMS->hMusic, TRUE, 1); UnbatchGraphics (); BeginHangarAnim (pMS); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ShowCombatShip ((COUNT)~0, (SHIP_FRAGMENTPTR)0); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } pMS->Initialized = TRUE; @@ -1275,13 +1275,13 @@ DoShipyard (PMENU_STATE pMS) { ExitShipyard: EndHangarAnim (pMS); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DestroyDrawable (ReleaseDrawable (pMS->ModuleFrame)); pMS->ModuleFrame = 0; pMS->CurFrame = 0; DestroyColorMap (ReleaseColorMap (pMS->CurString)); pMS->CurString = 0; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); return (FALSE); } @@ -1298,10 +1298,10 @@ ExitShipyard: if (GameOptions () == 0) goto ExitShipyard; DrawMenuStateStrings (PM_CREW, pMS->CurState); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect ((PRECT)~0L, (FRAME)0); BeginHangarAnim (pMS); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } } else diff --git a/sc2/src/sc2code/sis.c b/sc2/src/sc2code/sis.c index f5c361150..bd61eabe0 100644 --- a/sc2/src/sc2code/sis.c +++ b/sc2/src/sc2code/sis.c @@ -73,9 +73,9 @@ ClearSISRect (BYTE ClearFlags) if (ClearFlags & CLEAR_SIS_RADAR) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); DrawMenuStateStrings ((BYTE)~0, 1); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); #ifdef NEVER r.corner.x = RADAR_X - 1; r.corner.y = RADAR_Y - 1; @@ -812,7 +812,7 @@ DeltaSISGauges (SIZE crew_delta, SIZE fuel_delta, int resunit_delta) SUPPORT_SHIP_PTS }; - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); for (hStarShip = GetHeadLink (&GLOBAL (built_ship_q)), pship_pos = ship_pos; hStarShip; hStarShip = hNextShip, ++pship_pos) @@ -828,16 +828,16 @@ DeltaSISGauges (SIZE crew_delta, SIZE fuel_delta, int resunit_delta) s.origin.x = pship_pos->x; s.origin.y = pship_pos->y; s.frame = StarShipPtr->ShipInfo.icons; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); UnlockStarShip ( &GLOBAL (built_ship_q), hStarShip ); } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } @@ -1313,7 +1313,7 @@ int flash_rect_func(void *data) &tmp_rect, strength, 4); } } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (ScreenContext); SetContextClipRect (&cached_rect); // flash changed_can't be modified while GraphicSem is held @@ -1321,7 +1321,7 @@ int flash_rect_func(void *data) DrawStamp (pStamp); SetContextClipRect (NULL_PTR); // this will flush whatever SetContext (OldContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } FlushGraphics (); SleepThreadUntil (TimeIn + WaitTime); @@ -1391,9 +1391,9 @@ SetFlashRect (PRECT pRect, FRAME f) flash_rect1.extent.width = 0; if (flash_task) { - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); ConcludeTask (flash_task); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); } } else diff --git a/sc2/src/sc2code/starbase.c b/sc2/src/sc2code/starbase.c index b10453cc0..8db7ecfd7 100644 --- a/sc2/src/sc2code/starbase.c +++ b/sc2/src/sc2code/starbase.c @@ -256,12 +256,12 @@ s.origin.x = SAFE_X, s.origin.y = SAFE_Y + 4; { //CONTEXT OldContext; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawStamp (&s); s.frame = IncFrameIndex (s.frame); if (s.frame == pMenuState->CurFrame) s.frame = IncFrameIndex (s.frame); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); SleepThreadUntil (TimeIn + (ONE_SECOND / 20)); TimeIn = GetTimeCounter (); @@ -287,7 +287,7 @@ DoStarBase (PMENU_STATE pMS) LastActivity &= ~CHECK_LOAD; pMS->InputFunc = DoStarBase; - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); if (pMS->hMusic) @@ -306,7 +306,7 @@ DoStarBase (PMENU_STATE pMS) pMS->Initialized = TRUE; SetContext (ScreenContext); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); s.origin.x = s.origin.y = 0; s.origin.x = SAFE_X, s.origin.y = SAFE_Y + 4; @@ -314,7 +314,7 @@ s.origin.x = SAFE_X, s.origin.y = SAFE_Y + 4; pMS->CurFrame = s.frame; pMS->hMusic = LoadMusicInstance (STARBASE_MUSIC); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetTransitionSource (NULL); BatchGraphics (); SetContextBackGroundColor (BLACK_COLOR); @@ -334,7 +334,7 @@ s.origin.x = SAFE_X, s.origin.y = SAFE_Y + 4; UnbatchGraphics (); pMS->flash_task = AssignTask (rotate_starbase, 4096, "rotate starbase"); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); } else if (CurrentMenuState.select || GET_GAME_STATE (MOONBASE_ON_SHIP) @@ -410,9 +410,9 @@ ExitStarBase: if (NewState != pMS->CurState) { - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); DrawBaseStateStrings (pMS->CurState, NewState); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); pMS->CurState = NewState; } } diff --git a/sc2/src/sc2code/starcon.c b/sc2/src/sc2code/starcon.c index e9d4e4081..161b7f73e 100644 --- a/sc2/src/sc2code/starcon.c +++ b/sc2/src/sc2code/starcon.c @@ -46,7 +46,7 @@ int arilou_gate_task(void* data) counter = GET_GAME_STATE (ARILOU_SPACE_COUNTER); while (!Task_ReadState (task, TASK_EXIT)) { - SetSemaphore (GLOBAL (GameClock.clock_sem)); + LockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); if (GET_GAME_STATE (ARILOU_SPACE) == OPENING) { @@ -59,11 +59,11 @@ int arilou_gate_task(void* data) counter = 0; } - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SET_GAME_STATE (ARILOU_SPACE_COUNTER, counter); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); - ClearSemaphore (GLOBAL (GameClock.clock_sem)); + UnlockCrossThreadMutex (GLOBAL (GameClock.clock_lock)); SleepThreadUntil (TimeIn + BATTLE_FRAME_RATE); TimeIn = GetTimeCounter (); } @@ -980,9 +980,9 @@ sc = _simple_count; (int)_simple_count - (int)sc); #endif //TESTING - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); LastActivity = GLOBAL (CurrentActivity); diff --git a/sc2/src/sc2code/starcon.h b/sc2/src/sc2code/starcon.h index c1ffa1622..a652acd0e 100644 --- a/sc2/src/sc2code/starcon.h +++ b/sc2/src/sc2code/starcon.h @@ -163,7 +163,7 @@ extern BOOLEAN PagingEnabled; extern FRAME ActivityFrame; extern SOUND MenuSounds, GameSounds; extern QUEUE race_q[NUM_PLAYERS]; -extern Semaphore GraphicsSem; +extern CrossThreadMutex GraphicsLock; extern CondVar RenderingCond; extern STRING GameStrings; diff --git a/sc2/src/sc2code/utils.c b/sc2/src/sc2code/utils.c index 72a32af65..1cecf5f79 100644 --- a/sc2/src/sc2code/utils.c +++ b/sc2/src/sc2code/utils.c @@ -159,7 +159,7 @@ PauseGame (void) if (CommData.ConversationPhrases && PlayingTrack ()) PauseTrack (); - SetSemaphore (GraphicsSem); + LockCrossThreadMutex (GraphicsLock); OldContext = SetContext (ScreenContext); OldHot = SetFrameHot (Screen, MAKE_HOT_SPOT (0, 0)); @@ -171,12 +171,12 @@ PauseGame (void) F = CaptureDrawable (LoadDisplayPixmap (&r, (FRAME)0)); DrawStamp (&s); - // Releasing the Semaphore lets the rotate_planet_task + // Releasing the lock lets the rotate_planet_task // draw a frame. PauseRotate can still allow one more frame - // to be drawn, so it is safer to just not release the Semaphore - //ClearSemaphore (GraphicsSem); + // to be drawn, so it is safer to just not release the lock + //UnlockCrossThreadMutex (GraphicsLock); FlushGraphics (); - //SetSemaphore (GraphicsSem); + //LockCrossThreadMutex (GraphicsLock); while (ImmediateInputState.pause) TaskSwitch (); @@ -208,7 +208,7 @@ PauseGame (void) do_subtitles ((void *)~0); } - ClearSemaphore (GraphicsSem); + UnlockCrossThreadMutex (GraphicsLock); TaskSwitch (); GLOBAL (CurrentActivity) &= ~CHECK_PAUSE; diff --git a/sc2/src/starcon2.c b/sc2/src/starcon2.c index 511f4c399..e9f01c27e 100644 --- a/sc2/src/starcon2.c +++ b/sc2/src/starcon2.c @@ -348,7 +348,7 @@ main (int argc, char *argv[]) InitTimeSystem (); InitTaskSystem (); - GraphicsSem = CreateSemaphore (1, "Graphics"); + GraphicsLock = CreateCrossThreadMutex ("Graphics"); RenderingCond = CreateCondVar (); TFB_InitGraphics (gfxdriver, gfxflags, width, height, bpp);