diff options
Diffstat (limited to 'gmon/gmon.c')
-rw-r--r-- | gmon/gmon.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gmon/gmon.c b/gmon/gmon.c index 787da5a7e7..c3e7c51b8c 100644 --- a/gmon/gmon.c +++ b/gmon/gmon.c @@ -79,6 +79,10 @@ __moncontrol (mode) { struct gmonparam *p = &_gmonparam; + /* Don't change the state if we ran into an error. */ + if (p->state == GMON_PROF_ERROR) + return; + if (mode) { /* start */ @@ -131,7 +135,9 @@ __monstartup (lowpc, highpc) cp = calloc (p->kcountsize + p->fromssize + p->tossize, 1); if (! cp) { - ERR(_("monstartup: out of memory\n")); + ERR("monstartup: out of memory\n"); + p->tos = NULL; + p->state = GMON_PROF_ERROR; return; } p->tos = (struct tostruct *)cp; @@ -350,10 +356,12 @@ weak_alias (__write_profiling, write_profiling) void _mcleanup (void) { - __moncontrol (0); + __moncontrol (0); + if (_gmonparam.state != GMON_PROF_ERROR) write_gmon (); - /* free the memory. */ + /* free the memory. */ + if (_gmonparam.tos != NULL) free (_gmonparam.tos); } |