diff options
-rw-r--r-- | crawl-ref/source/files.cc | 37 | ||||
-rw-r--r-- | crawl-ref/source/misc/valgrind-suppress.txt | 36 |
2 files changed, 27 insertions, 46 deletions
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc index 72227f94cd..896ea8f849 100644 --- a/crawl-ref/source/files.cc +++ b/crawl-ref/source/files.cc @@ -1561,13 +1561,10 @@ void _save_level(int level_saved, level_area_type old_ltype, DO_CHMOD_PRIVATE(cha_fil.c_str()); } - -void save_game(bool leave_game, const char *farewellmsg) +// Stack allocated std::string's go in seperate function, so Valgrind doesn't +// complain. +static void _save_game_base() { - unwind_bool saving_game(crawl_state.saving_game, true); - - SavefileCallback::pre_save(); - /* Stashes */ std::string stashFile = get_savedir_filename(you.your_name, "", "st"); FILE *stashf = fopen(stashFile.c_str(), "wb"); @@ -1671,11 +1668,12 @@ void save_game(bool leave_game, const char *farewellmsg) fclose(charf); DO_CHMOD_PRIVATE(charFile.c_str()); +} - // If just save, early out. - if (!leave_game) - return; - +// Stack allocated std::string's go in seperate function, so Valgrind doesn't +// complain. +static void _save_game_exit() +{ // Must be exiting -- save level & goodbye! if (!you.entering_level) _save_level(you.your_level, you.level_type, you.where_are_you); @@ -1708,6 +1706,25 @@ void save_game(bool leave_game, const char *farewellmsg) delete _callback_list; _callback_list = NULL; } +} + +void save_game(bool leave_game, const char *farewellmsg) +{ + unwind_bool saving_game(crawl_state.saving_game, true); + + SavefileCallback::pre_save(); + + // Stack allocated std::string's go in seperate function, + // so Valgrind doesn't complain. + _save_game_base(); + + // If just save, early out. + if (!leave_game) + return; + + // Stack allocated std::string's go in seperate function, + // so Valgrind doesn't complain. + _save_game_exit(); end(0, false, farewellmsg? "%s" : "See you soon, %s!", farewellmsg? farewellmsg : you.your_name.c_str()); diff --git a/crawl-ref/source/misc/valgrind-suppress.txt b/crawl-ref/source/misc/valgrind-suppress.txt index 0eb75988a4..6856eb4ae6 100644 --- a/crawl-ref/source/misc/valgrind-suppress.txt +++ b/crawl-ref/source/misc/valgrind-suppress.txt @@ -1,39 +1,3 @@ -# stashFile in save_game() never gets freed since the process exits -# before save_game() returns. Wildcards at start and end of function -# names since they get mangled by the C++ compiler and mecheck goes -# by the mangled names. -# -# Also, the first "obj:*" is for the new() operator, which gets mangled -# in the valgrind library, and might be mangled differently in different -# version of valgrind. -# -# NOTE: The number of copies of "obj:*libstdc++*" might need to be changed -# for different versions of the C++ library. -{ - save_game_savedir_leak - Memcheck:Leak - obj:* - obj:*libstdc++* - obj:*libstdc++* - obj:*libstdc++* - obj:*libstdc++* - fun:*get_savedir_filename* - fun:*save_game* -} - -# Not sure what causes escape_path_spaces() in save_game() to leak, but -# since we're going to be exiting right away it doesn't really matter. -{ - save_game_escape_path_leak - Memcheck:Leak - obj:* - obj:*libstdc++* - obj:*libstdc++* - obj:*libstdc++* - fun:*escape_path_spaces* - fun:*save_game* -} - # The error variable in end() is stuff.cc never gets freed since # exit() is called before end() returns. See above suppression for more # notes |