Fix danger map threading, pointer-to-int compile -Werror warning, and dangerFloodFill running for player -1.

Refs ticket:2203.
master
Cyp 2010-11-22 15:47:55 +01:00
parent ae6b76dda5
commit 502c8a19ac
1 changed files with 11 additions and 11 deletions

View File

@ -57,12 +57,12 @@
static WZ_THREAD *dangerThread = NULL;
static WZ_SEMAPHORE *dangerSemaphore = NULL;
static WZ_SEMAPHORE *dangerDoneSemaphore = NULL;
struct floodtile { uint8_t x; uint8_t y; };
static struct floodtile *floodbucket = NULL;
static int bucketcounter;
static UDWORD lastDangerUpdate = 0;
static volatile int lastDangerPlayer = -1;
static volatile bool dangerDone = false;
static int lastDangerPlayer = -1;
struct ffnode
{
@ -1074,11 +1074,15 @@ BOOL mapShutdown(void)
if (dangerThread)
{
wzSemaphoreWait(dangerDoneSemaphore);
lastDangerPlayer = -1;
wzSemaphorePost(dangerSemaphore);
wzThreadJoin(dangerThread);
wzSemaphoreDestroy(dangerSemaphore);
wzSemaphoreDestroy(dangerDoneSemaphore);
dangerThread = NULL;
dangerSemaphore = NULL;
dangerDoneSemaphore = NULL;
}
free(psMapTiles);
@ -1628,9 +1632,8 @@ bool fireOnLocation(unsigned int x, unsigned int y)
}
// This function runs in a separate thread!
static int dangerFloodFill(WZ_DECL_UNUSED void *data)
static int dangerFloodFill(int player)
{
int player = lastDangerPlayer;
int i;
Vector2i pos = getPlayerStartPosition(player);
Vector2i npos;
@ -1701,7 +1704,7 @@ static int dangerThreadFunc(WZ_DECL_UNUSED void *data)
while (lastDangerPlayer != -1)
{
dangerFloodFill(lastDangerPlayer); // Do the actual work
dangerDone = true; // Signal that we are done
wzSemaphorePost(dangerDoneSemaphore); // Signal that we are done
wzSemaphoreWait(dangerSemaphore); // Go to sleep until needed.
}
return 0;
@ -1821,6 +1824,7 @@ void mapInit()
{
lastDangerPlayer = 0;
dangerSemaphore = wzSemaphoreCreate(0);
dangerDoneSemaphore = wzSemaphoreCreate(0);
dangerThread = wzThreadCreate(dangerThreadFunc, NULL);
wzThreadStart(dangerThread);
}
@ -1847,12 +1851,8 @@ void mapUpdate()
if (gameTime > lastDangerUpdate + GAME_TICKS_FOR_DANGER && game.type == SKIRMISH)
{
// Spin lock if previous job not done yet
while (!dangerDone)
{
SDL_Delay(1);
ASSERT_OR_RETURN(, gameTime < lastDangerUpdate + GAME_TICKS_FOR_DANGER * 100, "Timed out waiting for danger map");
}
// Lock if previous job not done yet
wzSemaphoreWait(dangerDoneSemaphore);
auxMapRestore(lastDangerPlayer, AUX_DANGERMAP, AUXBITS_THREAT | AUXBITS_AATHREAT | AUXBITS_DANGER);
lastDangerPlayer = (lastDangerPlayer + 1 ) % game.maxPlayers;