From: PatR Date: Thu, 10 Feb 2022 20:14:27 +0000 (-0800) Subject: memory management X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ea4b00879f5037579bfa99e87e7bf8fc0d0c4da;p=nethack memory management MONITOR_HEAP+heaputil pointed out some unreleased memory. The livelog stuff wasn't being freed. Not surpringly the data used for collecting and formatting build-options that just got changed from strdup() to dupstr() wasn't being freed. And a couple of date/version bits. --- diff --git a/include/extern.h b/include/extern.h index 089db2250..3dfa5573d 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1,4 +1,4 @@ -/* NetHack 3.7 extern.h $NHDT-Date: 1637992233 2021/11/27 05:50:33 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1018 $ */ +/* NetHack 3.7 extern.h $NHDT-Date: 1644524039 2022/02/10 20:13:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1046 $ */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ @@ -28,6 +28,9 @@ extern void welcome(boolean); extern int argcheck(int, char **, enum earlyarg); extern long timet_to_seconds(time_t); extern long timet_delta(time_t, time_t); +#ifndef NODUMPENUMS +extern void dump_enums(void); +#endif /* ### apply.c ### */ @@ -1246,9 +1249,7 @@ extern int buzzmu(struct monst *, struct attack *); extern void runtime_info_init(void); extern const char *do_runtime_info(int *); -#ifndef NODUMPENUMS -extern void dump_enums(void); -#endif +extern void release_runtime_info(void); /* ### mhitm.c ### */ diff --git a/src/date.c b/src/date.c index c6f8acb69..13f6c9445 100644 --- a/src/date.c +++ b/src/date.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 date.c $NHDT-Date: 1639622347 2021/12/16 02:39:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.0 $ */ +/* NetHack 3.7 date.c $NHDT-Date: 1644524054 2022/02/10 20:14:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ */ /* Copyright (c) Michael Allison, 2021. */ /* NetHack may be freely redistributed. See license for details. */ @@ -139,6 +139,16 @@ free_nomakedefs(void) if (nomakedefs.copyright_banner_c) free((genericptr_t) nomakedefs.copyright_banner_c), nomakedefs.copyright_banner_c = 0; +#ifdef NETHACK_GIT_SHA + if (nomakedefs.git_sha) + free((genericptr_t) nomakedefs.git_sha), + nomakedefs.git_sha = 0; +#endif +#ifdef NETHACK_GIT_BRANCH + if (nomakedefs.git_branch) + free((genericptr_t) nomakedefs.git_branch), + nomakedefs.git_branch = 0; +#endif } #endif /* __DATE__ && __TIME__ */ diff --git a/src/end.c b/src/end.c index 4ed8d7010..d1a327a88 100644 --- a/src/end.c +++ b/src/end.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 end.c $NHDT-Date: 1621380392 2021/05/18 23:26:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.225 $ */ +/* NetHack 3.7 end.c $NHDT-Date: 1644524059 2022/02/10 20:14:19 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.235 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -746,8 +746,9 @@ dump_plines(void) /*ARGSUSED*/ static void -dump_everything(int how, - time_t when) /* date+time at end of game */ +dump_everything( + int how, /* ASCENDED, ESCAPED, QUIT, etc */ + time_t when) /* date+time at end of game */ { #ifdef DUMPLOG char pbuf[BUFSZ], datetimebuf[24]; /* [24]: room for 64-bit bogus value */ @@ -778,11 +779,11 @@ dump_everything(int how, putstr(0, 0, ""); /* character name and basic role info */ - Sprintf(pbuf, "%s, %s %s %s %s", g.plname, - aligns[1 - u.ualign.type].adj, - genders[flags.female].adj, - g.urace.adj, - (flags.female && g.urole.name.f) ? g.urole.name.f : g.urole.name.m); + Sprintf(pbuf, "%s, %s %s %s %s", + g.plname, aligns[1 - u.ualign.type].adj, + genders[flags.female].adj, g.urace.adj, + (flags.female && g.urole.name.f) ? g.urole.name.f + : g.urole.name.m); putstr(0, 0, pbuf); putstr(0, 0, ""); @@ -1776,7 +1777,6 @@ nh_terminate(int status) dlb_cleanup(); l_nhcore_done(); } - free_nomakedefs(); #ifdef VMS /* diff --git a/src/mdlib.c b/src/mdlib.c index 633d0efe1..1e7613a47 100644 --- a/src/mdlib.c +++ b/src/mdlib.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 mdlib.c $NHDT-Date: 1608933420 2020/12/25 21:57:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.17 $ */ +/* NetHack 3.7 mdlib.c $NHDT-Date: 1644524060 2022/02/10 20:14:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.27 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ /* Copyright (c) M. Stephenson, 1990, 1991. */ @@ -78,12 +78,15 @@ extern int GUILaunched; /* these are in extern.h but we don't include hack.h */ void runtime_info_init(void); const char *do_runtime_info(int *); +void release_runtime_info(void); void populate_nomakedefs(struct version_info *); +extern void free_nomakedefs(void); /* date.c */ void build_options(void); static int count_and_validate_winopts(void); static void opt_out_words(char *, int *); static void build_savebones_compat_string(void); + static int idxopttext, done_runtime_opt_init_once = 0; #define MAXOPT 40 static char *opttext[120] = { 0 }; @@ -626,8 +629,9 @@ count_and_validate_winopts(void) } static void -opt_out_words(char *str, /* input, but modified during processing */ - int *length_p) /* in/out */ +opt_out_words( + char *str, /* input, but modified during processing */ + int *length_p) /* in/out */ { char *word; @@ -645,7 +649,7 @@ opt_out_words(char *str, /* input, but modified during processing */ if (idxopttext < (MAXOPT - 1)) idxopttext++; Sprintf(optbuf, "%s", opt_indent), - *length_p = (int) strlen(opt_indent); + *length_p = (int) strlen(opt_indent); } else { Sprintf(eos(optbuf), " "), (*length_p)++; } @@ -834,4 +838,15 @@ do_runtime_info(int *rtcontext) return retval; } +void +release_runtime_info() +{ + while (idxopttext > 0) { + --idxopttext; + free((genericptr_t) opttext[idxopttext]), opttext[idxopttext] = 0; + } + done_runtime_opt_init_once = 0; + free_nomakedefs(); +} + /*mdlib.c*/ diff --git a/src/save.c b/src/save.c index b957bc24f..fc5f81e21 100644 --- a/src/save.c +++ b/src/save.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 save.c $NHDT-Date: 1606949327 2020/12/02 22:48:47 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.164 $ */ +/* NetHack 3.7 save.c $NHDT-Date: 1644524061 2022/02/10 20:14:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.181 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2009. */ /* NetHack may be freely redistributed. See license for details. */ @@ -229,7 +229,7 @@ dosave0(void) } static void -save_gamelog(NHFILE* nhfp) +save_gamelog(NHFILE *nhfp) { struct gamelog_line *tmp = g.gamelog, *tmp2; int slen; @@ -239,9 +239,10 @@ save_gamelog(NHFILE* nhfp) if (perform_bwrite(nhfp)) { if (nhfp->structlevel) { slen = strlen(tmp->text); - bwrite(nhfp->fd, (genericptr_t) &slen, sizeof(slen)); + bwrite(nhfp->fd, (genericptr_t) &slen, sizeof slen); bwrite(nhfp->fd, (genericptr_t) tmp->text, slen); - bwrite(nhfp->fd, (genericptr_t) tmp, sizeof(struct gamelog_line)); + bwrite(nhfp->fd, (genericptr_t) tmp, + sizeof (struct gamelog_line)); } } if (release_data(nhfp)) { @@ -253,7 +254,7 @@ save_gamelog(NHFILE* nhfp) if (perform_bwrite(nhfp)) { if (nhfp->structlevel) { slen = -1; - bwrite(nhfp->fd, (genericptr_t) &slen, sizeof(slen)); + bwrite(nhfp->fd, (genericptr_t) &slen, sizeof slen); } } if (release_data(nhfp)) @@ -1090,6 +1091,7 @@ freedynamicdata(void) #define free_timers(R) save_timers(&tnhfp, R) #define free_light_sources(R) save_light_sources(&tnhfp, R) #define free_animals() mon_animal_list(FALSE) +#define discard_gamelog() save_gamelog(&tnhfp); /* move-specific data */ dmonsfree(); /* release dead monsters */ @@ -1137,13 +1139,15 @@ freedynamicdata(void) #ifdef USER_SOUNDS release_sound_mappings(); #endif +#ifdef DUMPLOG + dumplogfreemessages(); +#endif + discard_gamelog(); + release_runtime_info(); /* build-time options and version stuff */ #endif /* FREE_ALL_MEMORY */ if (VIA_WINDOWPORT()) status_finish(); -#ifdef DUMPLOG - dumplogfreemessages(); -#endif /* last, because it frees data that might be used by panic() to provide feedback to the user; conceivably other freeing might trigger panic */