From: Chris Vine <chris@cvine.freeserve.co.uk>
To: 19235@debbugs.gnu.org
Subject: bug#19235: make-fresh-user-module procedure leaks memory
Date: Sun, 30 Nov 2014 23:28:34 +0000 [thread overview]
Message-ID: <20141130232834.32cbf5b2@bother.homenet> (raw)
The make-fresh-user-module procedure leaks memory in guile-2.0.11 as
demonstrated by the attached test case. This test case should be
invoked either with the "shared" or "fresh" option. If invoked with
the "fresh" option, it will call make-fresh-user-module on each
iteration through the loop. On my 32-bit machine it will steadily
accumulate a memory leak before running out of memory on consuming
approximately 2.2G memory, after about 180,000 iterations. If called
with the "shared" option, it will accumulate no additional memory while
executing, and will execute normally to the end of its iterations.
The question which might be asked is "Would any sane person ever want
to invoke the make-fresh-user-module procedure more than a few times
in a practical program?". The answer to this question is "Yes", if
guile is being used as an extension framework for a C or C++ program,
and it executes guile extensions as individual tasks, and it is
necessary that top levels should not to be shared. The execution of
tasks concurrently is one such case, but there can be many cases where
isolated top levels are desirable for tasks executed serially also.
Test case:
----------------------------- snip -----------------------------
/* compile with 'gcc -O2 -Wall `pkg-config --cflags --libs guile-2.0` -o test-guile' */
#include <unistd.h>
#include <libguile.h>
#include <stdio.h>
#include <string.h>
int fresh;
void* func (void* data)
{
switch (fresh)
{
case 0:
scm_c_eval_string("");
break;
default:
scm_c_eval_string("(set-current-module (make-fresh-user-module))");
}
return NULL;
}
int main (int argc, char *argv[])
{
int count;
if (argc != 2
|| (strcmp (argv[1], "shared") &&
strcmp (argv[1], "fresh")))
{
puts ("Usage: test-guile shared | fresh");
exit (1);
}
if (!strcmp (argv[1], "fresh"))
{
puts("Invoking make-fresh-user-module");
fresh = 1;
}
else
puts("Using shared top level");
for (count = 0; count < 256000; ++count)
{
scm_with_guile(func, NULL);
if (!(count % 100)) {
printf("%d ", count);
fflush(stdout);
}
usleep(1);
}
puts("");
return 0;
}
next reply other threads:[~2014-11-30 23:28 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-30 23:28 Chris Vine [this message]
2014-12-07 8:07 ` bug#19235: make-fresh-user-module procedure leaks memory Mark H Weaver
2014-12-07 14:19 ` Chris Vine
2014-12-26 18:26 ` Chris Vine
2016-06-22 17:52 ` Andy Wingo
2016-06-23 14:17 ` Mark H Weaver
2016-06-24 8:04 ` bug#15602: " Ludovic Courtès
2016-06-26 0:50 ` Mark H Weaver
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141130232834.32cbf5b2@bother.homenet \
--to=chris@cvine.freeserve.co.uk \
--cc=19235@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).