[gnumeric] Perl: leak fixes.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Perl: leak fixes.
- Date: Fri, 20 Apr 2018 17:23:12 +0000 (UTC)
commit ff8df1ed129a6c663b8fbbc3fbb79099c6154804
Author: Morten Welinder <terra gnome org>
Date: Fri Apr 20 13:22:46 2018 -0400
Perl: leak fixes.
Incomplete and hacky.
plugins/perl-loader/boot.c | 10 ++++++++++
plugins/perl-loader/perl-cc-wrapper | 4 ++++
plugins/perl-loader/perl-loader.c | 19 ++++++++++++-------
plugins/perl-loader/perl-loader.h | 2 ++
4 files changed, 28 insertions(+), 7 deletions(-)
---
diff --git a/plugins/perl-loader/boot.c b/plugins/perl-loader/boot.c
index 7b13565..0d2a1e3 100644
--- a/plugins/perl-loader/boot.c
+++ b/plugins/perl-loader/boot.c
@@ -11,8 +11,16 @@
#include "perl-loader.h"
+static GSList *stuff_to_free;
+
GNM_PLUGIN_MODULE_HEADER;
+void
+gnm_perl_loader_free_later (gconstpointer data)
+{
+ stuff_to_free = g_slist_prepend (stuff_to_free, (gpointer)data);
+}
+
GType perl_get_loader_type (GOErrorInfo **ret_error);
G_MODULE_EXPORT GType
@@ -25,6 +33,8 @@ perl_get_loader_type (GOErrorInfo **ret_error)
G_MODULE_EXPORT void
go_plugin_shutdown (GOPlugin *plugin, GOCmdContext *cc)
{
+ g_slist_free_full (stuff_to_free, g_free);
+ stuff_to_free = NULL;
}
G_MODULE_EXPORT void
diff --git a/plugins/perl-loader/perl-cc-wrapper b/plugins/perl-loader/perl-cc-wrapper
index fe6de82..4d86b50 100644
--- a/plugins/perl-loader/perl-cc-wrapper
+++ b/plugins/perl-loader/perl-cc-wrapper
@@ -36,6 +36,10 @@ while (@ARGV) {
}
}
+# Uncomment to force debug information
+# push @cmd, '-g';
+
+# print STDERR "# ", join (" ", @cmd), "\n";
system (@cmd);
my $code = $?;
diff --git a/plugins/perl-loader/perl-loader.c b/plugins/perl-loader/perl-loader.c
index 81c0acc..b0f6fcd 100644
--- a/plugins/perl-loader/perl-loader.c
+++ b/plugins/perl-loader/perl-loader.c
@@ -125,9 +125,10 @@ static const GnmFuncHelp help_template[] = {
{ GNM_FUNC_HELP_END }
};
-static GnmFuncHelp *default_gnm_help(const char *name)
+static GnmFuncHelp *
+default_gnm_help(const char *name)
{
- GnmFuncHelp *help = g_new (GnmFuncHelp, 3);
+ GnmFuncHelp *help = g_new0 (GnmFuncHelp, 3);
if (help) {
int i;
for (i = 0; i < 3; i++)
@@ -141,12 +142,11 @@ static GnmFuncHelp *default_gnm_help(const char *name)
static GnmFuncHelp *
make_gnm_help (const char *name, int count, SV **SP)
{
- gchar *help_perl_func = g_strconcat ("help_", name, NULL);
GnmFuncHelp *help = NULL;
/* We assume that the description is a Perl array of the form
(key, text, key, text, ...). */
int n = count / 2, m = 0, k, type = GNM_FUNC_HELP_END;
- GnmFuncHelp *helptmp = g_new (GnmFuncHelp, n + 1);
+ GnmFuncHelp *helptmp = g_new0 (GnmFuncHelp, n + 1);
if (count % 2) POPs, count--;
for (k = n; k-- > 0; ) {
SV *sv = POPs;
@@ -175,9 +175,9 @@ make_gnm_help (const char *name, int count, SV **SP)
g_free (helptmp);
} else {
/* Collect all valid entries in a new array. */
- if (n == m)
+ if (n == m) {
help = helptmp;
- else {
+ } else {
int i;
help = g_new (GnmFuncHelp, m+1);
for (i = 0, k = 0; k < n; k++)
@@ -192,6 +192,10 @@ make_gnm_help (const char *name, int count, SV **SP)
if (!help) /* Provide a reasonable default. */
help = default_gnm_help (name);
+ gnm_perl_loader_free_later (help);
+ for (n = 0; help[n].type != GNM_FUNC_HELP_END; n++)
+ gnm_perl_loader_free_later (help[n].text);
+
return help;
}
@@ -220,7 +224,7 @@ gplp_func_desc_load (GOPluginService *service,
g_print ( _("Perl error: %s\n"), SvPV (ERRSV, n_a));
while (count-- > 0) POPs;
} else {
- help = make_gnm_help(name, count, SP);
+ help = make_gnm_help(name, count, SP);
}
PUTBACK;
@@ -240,6 +244,7 @@ gplp_func_desc_load (GOPluginService *service,
POPs;
} else {
arg_spec = g_strdup (POPp);
+ gnm_perl_loader_free_later (arg_spec);
}
PUTBACK;
diff --git a/plugins/perl-loader/perl-loader.h b/plugins/perl-loader/perl-loader.h
index dc4d7dc..c6a7285 100644
--- a/plugins/perl-loader/perl-loader.h
+++ b/plugins/perl-loader/perl-loader.h
@@ -6,4 +6,6 @@
GType gnm_perl_plugin_loader_get_type (void);
void gnm_perl_plugin_loader_register_type (GTypeModule *module);
+void gnm_perl_loader_free_later (gconstpointer data);
+
#endif /* GNM_PERL_PLUGIN_LOADER_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]