mirror of https://github.com/OpenTTD/OpenTTD
(svn r7237) -Fix: TGP landscape generation could leak memory if aborted during the generation of the heightmap.
parent
77c564bd86
commit
204d64b238
13
genworld.c
13
genworld.c
|
@ -164,6 +164,15 @@ void GenerateWorldSetCallback(gw_done_proc *proc)
|
||||||
_gw.proc = proc;
|
_gw.proc = proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set here the function, if any, that you want to be called when landscape
|
||||||
|
* generation is aborted.
|
||||||
|
*/
|
||||||
|
void GenerateWorldSetAbortCallback(gw_abort_proc *proc)
|
||||||
|
{
|
||||||
|
_gw.abortp = proc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This will wait for the thread to finish up his work. It will not continue
|
* This will wait for the thread to finish up his work. It will not continue
|
||||||
* till the work is done.
|
* till the work is done.
|
||||||
|
@ -201,12 +210,15 @@ void HandleGeneratingWorldAbortion(void)
|
||||||
/* Clean up - in SE create an empty map, otherwise, go to intro menu */
|
/* Clean up - in SE create an empty map, otherwise, go to intro menu */
|
||||||
_switch_mode = (_game_mode == GM_EDITOR) ? SM_EDITOR : SM_MENU;
|
_switch_mode = (_game_mode == GM_EDITOR) ? SM_EDITOR : SM_MENU;
|
||||||
|
|
||||||
|
if (_gw.abortp != NULL) _gw.abortp();
|
||||||
|
|
||||||
if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE);
|
if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE);
|
||||||
/* Show all vital windows again, because we have hidden them */
|
/* Show all vital windows again, because we have hidden them */
|
||||||
if (_gw.threaded && _game_mode != GM_MENU) ShowVitalWindows();
|
if (_gw.threaded && _game_mode != GM_MENU) ShowVitalWindows();
|
||||||
_gw.active = false;
|
_gw.active = false;
|
||||||
_gw.thread = NULL;
|
_gw.thread = NULL;
|
||||||
_gw.proc = NULL;
|
_gw.proc = NULL;
|
||||||
|
_gw.abortp = NULL;
|
||||||
_gw.threaded = false;
|
_gw.threaded = false;
|
||||||
|
|
||||||
DeleteWindowById(WC_GENERATE_PROGRESS_WINDOW, 0);
|
DeleteWindowById(WC_GENERATE_PROGRESS_WINDOW, 0);
|
||||||
|
@ -229,6 +241,7 @@ void GenerateWorld(int mode, uint size_x, uint size_y)
|
||||||
_gw.size_y = size_y;
|
_gw.size_y = size_y;
|
||||||
_gw.active = true;
|
_gw.active = true;
|
||||||
_gw.abort = false;
|
_gw.abort = false;
|
||||||
|
_gw.abortp = NULL;
|
||||||
_gw.lp = _local_player;
|
_gw.lp = _local_player;
|
||||||
_gw.wait_for_draw = false;
|
_gw.wait_for_draw = false;
|
||||||
_gw.quit_thread = false;
|
_gw.quit_thread = false;
|
||||||
|
|
|
@ -25,6 +25,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void gw_done_proc(void);
|
typedef void gw_done_proc(void);
|
||||||
|
typedef void gw_abort_proc(void);
|
||||||
|
|
||||||
typedef struct gw_info {
|
typedef struct gw_info {
|
||||||
bool active; //! Is generating world active
|
bool active; //! Is generating world active
|
||||||
|
@ -37,6 +38,7 @@ typedef struct gw_info {
|
||||||
uint size_x; //! X-size of the map
|
uint size_x; //! X-size of the map
|
||||||
uint size_y; //! Y-size of the map
|
uint size_y; //! Y-size of the map
|
||||||
gw_done_proc *proc; //! Proc that is called when done (can be NULL)
|
gw_done_proc *proc; //! Proc that is called when done (can be NULL)
|
||||||
|
gw_abort_proc *abortp; //! Proc that is called when aborting (can be NULL)
|
||||||
OTTDThread *thread; //! The thread we are in (can be NULL)
|
OTTDThread *thread; //! The thread we are in (can be NULL)
|
||||||
} gw_info;
|
} gw_info;
|
||||||
|
|
||||||
|
@ -74,6 +76,7 @@ void SetGeneratingWorldPaintStatus(bool status);
|
||||||
bool IsGeneratingWorldReadyForPaint(void);
|
bool IsGeneratingWorldReadyForPaint(void);
|
||||||
bool IsGenerateWorldThreaded(void);
|
bool IsGenerateWorldThreaded(void);
|
||||||
void GenerateWorldSetCallback(gw_done_proc *proc);
|
void GenerateWorldSetCallback(gw_done_proc *proc);
|
||||||
|
void GenerateWorldSetAbortCallback(gw_abort_proc *proc);
|
||||||
void WaitTillGeneratedWorld(void);
|
void WaitTillGeneratedWorld(void);
|
||||||
void GenerateWorld(int mode, uint size_x, uint size_y);
|
void GenerateWorld(int mode, uint size_x, uint size_y);
|
||||||
void AbortGeneratingWorld(void);
|
void AbortGeneratingWorld(void);
|
||||||
|
|
3
tgp.c
3
tgp.c
|
@ -798,6 +798,8 @@ void GenerateTerrainPerlin(void)
|
||||||
uint x, y;
|
uint x, y;
|
||||||
|
|
||||||
if (!AllocHeightMap()) return;
|
if (!AllocHeightMap()) return;
|
||||||
|
GenerateWorldSetAbortCallback(FreeHeightMap);
|
||||||
|
|
||||||
HeightMapGenerate();
|
HeightMapGenerate();
|
||||||
|
|
||||||
IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
|
IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
|
||||||
|
@ -823,4 +825,5 @@ void GenerateTerrainPerlin(void)
|
||||||
for (x = 0; x < _height_map.size_x; x++) MakeVoid(_height_map.size_x * y + x);
|
for (x = 0; x < _height_map.size_x; x++) MakeVoid(_height_map.size_x * y + x);
|
||||||
|
|
||||||
FreeHeightMap();
|
FreeHeightMap();
|
||||||
|
GenerateWorldSetAbortCallback(NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue