summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/files.cc37
-rw-r--r--crawl-ref/source/misc/valgrind-suppress.txt36
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