r17211 - gnucash/branches/gda-dev2/src - 1) Fix memory leaks in sql backend
Phil Longstaff
plongstaff at cvs.gnucash.org
Tue Jun 10 21:18:53 EDT 2008
Author: plongstaff
Date: 2008-06-10 21:18:52 -0400 (Tue, 10 Jun 2008)
New Revision: 17211
Trac: http://svn.gnucash.org/trac/changeset/17211
Modified:
gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c
gnucash/branches/gda-dev2/src/backend/file/gnc-account-xml-v2.c
gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c
gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h
gnucash/branches/gda-dev2/src/engine/SchedXaction.c
gnucash/branches/gda-dev2/src/engine/gnc-commodity.c
gnucash/branches/gda-dev2/src/gnome-utils/gnc-file.c
gnucash/branches/gda-dev2/src/valgrind-glib.supp
gnucash/branches/gda-dev2/src/valgrind-libguile.supp
Log:
1) Fix memory leaks in sql backend
2) Ensure sqlite file is put into correct path
3) Create a template commodity when a book is initialized. Then, use
this when template accounts are created. This results in 2 template
commodities, one for the template root account and one for the other
template accounts. This is at least better than 1 per template account.
When an sqlite file is loaded, the template root ends up with a NULL
commodity (and a logged message).
Modified: gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -231,7 +231,7 @@
const gchar* table_name;
dbi_result result;
- table_name = dbi_result_get_string_idx( tables, 0 );
+ table_name = dbi_result_get_string_idx( tables, 1 );
result = dbi_conn_queryf( be->conn, "DROP TABLE %s", table_name );
}
@@ -283,7 +283,17 @@
gnc_be->primary_book = NULL;
if( !initialized ) {
- int num_drivers = dbi_initialize( "/usr/lib/dbd" );
+#define DEFAULT_DBD_DIR "/usr/lib/dbd"
+ const gchar* driver_dir;
+ int num_drivers;
+
+ driver_dir = g_getenv( "GNC_DBD_DIR" );
+ if( driver_dir == NULL ) {
+ PWARN( "GNC_DBD_DIR not set: using %s\n", DEFAULT_DBD_DIR );
+ driver_dir = DEFAULT_DBD_DIR;
+ }
+
+ num_drivers = dbi_initialize( driver_dir );
gnc_sql_init( &gnc_be->sql_be );
initialized = TRUE;
}
@@ -515,6 +525,7 @@
GncSqlStatement base;
GString* sql;
+ GncSqlConnection* conn;
} GncDbiSqlStatement;
static void
@@ -544,13 +555,13 @@
gchar* buf;
buf = g_strdup_printf( " WHERE %s = %s", table_row->col_name,
- gnc_sql_get_sql_value( value ) );
+ gnc_sql_get_sql_value( dbi_stmt->conn, value ) );
g_string_append( dbi_stmt->sql, buf );
g_free( buf );
}
static GncSqlStatement*
-create_dbi_statement( gchar* sql )
+create_dbi_statement( GncSqlConnection* conn, gchar* sql )
{
GncDbiSqlStatement* stmt;
@@ -560,6 +571,7 @@
stmt->base.addWhereCond = stmt_add_where_cond;
stmt->sql = g_string_new( sql );
g_free( sql );
+ stmt->conn = conn;
return (GncSqlStatement*)stmt;
}
@@ -600,13 +612,16 @@
GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn;
GncDbiSqlStatement* dbi_stmt = (GncDbiSqlStatement*)stmt;
dbi_result result;
+ gint num_rows;
result = dbi_conn_query( dbi_conn->conn, dbi_stmt->sql->str );
if( result == NULL ) {
PERR( "Error executing SQL %s\n", dbi_stmt->sql->str );
return 0;
}
- return dbi_result_get_numrows_affected( result );
+ num_rows = dbi_result_get_numrows_affected( result );
+ dbi_result_free( result );
+ return num_rows;
}
static GncSqlStatement*
@@ -614,7 +629,7 @@
{
GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn;
- return create_dbi_statement( sql );
+ return create_dbi_statement( conn, sql );
}
static GValue*
@@ -722,6 +737,7 @@
GString* ddl;
const GList* list_node;
guint col_num;
+ dbi_result result;
g_return_if_fail( conn != NULL );
g_return_if_fail( table_name != NULL );
@@ -740,7 +756,8 @@
}
g_string_append( ddl, ")" );
- dbi_conn_query( dbi_conn->conn, ddl->str );
+ result = dbi_conn_query( dbi_conn->conn, ddl->str );
+ dbi_result_free( result );
g_string_free( ddl, TRUE );
}
@@ -827,6 +844,22 @@
#endif
}
+static gchar*
+conn_quote_string( const GncSqlConnection* conn, gchar* unquoted_str )
+{
+ GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn;
+ gchar* quoted_str;
+ gint size;
+
+ size = dbi_conn_quote_string_copy( dbi_conn->conn, unquoted_str,
+ "ed_str );
+ if( size != 0 ) {
+ return quoted_str;
+ } else {
+ return NULL;
+ }
+}
+
static GncSqlConnection*
create_dbi_connection( dbi_conn conn )
{
@@ -844,6 +877,7 @@
dbi_conn->base.getColumnTypeName = conn_get_column_type_name;
dbi_conn->base.createTable = conn_create_table;
dbi_conn->base.createIndex = conn_create_index;
+ dbi_conn->base.quoteString = conn_quote_string;
dbi_conn->conn = conn;
return (GncSqlConnection*)dbi_conn;
Modified: gnucash/branches/gda-dev2/src/backend/file/gnc-account-xml-v2.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/file/gnc-account-xml-v2.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/backend/file/gnc-account-xml-v2.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -219,7 +219,8 @@
struct account_pdata *pdata = act_pdata;
gnc_commodity *ref;
- ref = dom_tree_to_commodity_ref_no_engine(node, pdata->book);
+// ref = dom_tree_to_commodity_ref_no_engine(node, pdata->book);
+ ref = dom_tree_to_commodity_ref(node, pdata->book);
xaccAccountSetCommodity(pdata->account, ref);
return TRUE;
Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -677,11 +677,13 @@
return (GncSqlResult*)result;
}
/* --------------------------------------------------------- */
+typedef struct GncGdaSqlConnection_s GncGdaSqlConnection;
typedef struct
{
GncSqlStatement base;
GString* sql;
+ GncGdaSqlConnection* conn;
} GncGdaSqlStatement;
static void
@@ -711,13 +713,13 @@
gchar* buf;
buf = g_strdup_printf( " WHERE %s = %s", table_row->col_name,
- gnc_sql_get_sql_value( value ) );
+ gnc_sql_get_sql_value( (GncSqlConnection*)(gda_stmt->conn), value ) );
g_string_append( gda_stmt->sql, buf );
g_free( buf );
}
static GncSqlStatement*
-create_gda_statement( const gchar* sql )
+create_gda_statement( GncGdaSqlConnection* conn, const gchar* sql )
{
GncGdaSqlStatement* stmt;
@@ -726,18 +728,19 @@
stmt->base.toSql = stmt_to_sql;
stmt->base.addWhereCond = stmt_add_where_cond;
stmt->sql = g_string_new( sql );
+ stmt->conn = conn;
return (GncSqlStatement*)stmt;
}
/* --------------------------------------------------------- */
-typedef struct
+struct GncGdaSqlConnection_s
{
GncSqlConnection base;
GdaConnection* conn;
GdaSqlParser* parser;
GdaServerProvider* server;
-} GncGdaSqlConnection;
+};
static void
conn_dispose( GncSqlConnection* conn )
@@ -800,7 +803,7 @@
{
GncGdaSqlConnection* gda_conn = (GncGdaSqlConnection*)conn;
- return create_gda_statement( sql );
+ return create_gda_statement( gda_conn, sql );
}
static GValue*
Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -209,12 +209,10 @@
getter = gnc_sql_get_getter( obj_name, table_row );
s = (gchar*)(*getter)( pObject, NULL );
}
+ g_value_init( value, G_TYPE_STRING );
if( s ) {
- buf = g_strdup_printf( "'%s'", s );
- g_value_init( value, G_TYPE_STRING );
- g_value_take_string( value, buf );
+ g_value_set_string( value, s );
} else {
- g_value_init( value, G_TYPE_STRING );
g_value_set_string( value, "NULL" );
}
@@ -603,11 +601,9 @@
guid = (*getter)( pObject, NULL );
}
if( guid != NULL ) {
- gchar* buf;
(void)guid_to_string_buff( guid, guid_buf );
- buf = g_strdup_printf( "'%s'", guid_buf );
g_value_init( value, G_TYPE_STRING );
- g_value_take_string( value, buf );
+ g_value_set_string( value, guid_buf );
} else {
g_value_init( value, G_TYPE_STRING );
g_value_set_string( value, "NULL" );
@@ -632,7 +628,6 @@
gchar guid_buf[GUID_ENCODING_LENGTH+1];
QofInstance* inst;
GValue* value;
- gchar* buf;
g_return_if_fail( be != NULL );
g_return_if_fail( obj_name != NULL );
@@ -651,9 +646,8 @@
}
if( guid != NULL ) {
(void)guid_to_string_buff( guid, guid_buf );
- buf = g_strdup_printf( "'%s'", guid_buf );
g_value_init( value, G_TYPE_STRING );
- g_value_take_string( value, buf );
+ g_value_set_string( value, guid_buf );
} else {
g_value_init( value, G_TYPE_STRING );
g_value_set_string( value, "NULL" );
@@ -674,7 +668,7 @@
typedef Timespec (*TimespecAccessFunc)( const gpointer );
typedef void (*TimespecSetterFunc)( const gpointer, Timespec );
-#define TIMESPEC_STR_FORMAT "'%04d%02d%02d%02d%02d%02d'"
+#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
static void
@@ -855,7 +849,7 @@
value = g_new0( GValue, 1 );
getter = gnc_sql_get_getter( obj_name, table_row );
date = (GDate*)(*getter)( pObject, NULL );
- buf = g_strdup_printf( "'%04d%02d%02d'",
+ buf = g_strdup_printf( "%04d%02d%02d",
g_date_get_year( date ), g_date_get_month( date ), g_date_get_day( date ) );
g_value_init( value, G_TYPE_STRING );
g_value_take_string( value, buf );
@@ -1365,6 +1359,7 @@
}
if( sqlStmt != NULL ) {
gnc_sql_execute_statement( be, sqlStmt );
+ gnc_sql_statement_dispose( sqlStmt );
return TRUE;
} else {
@@ -1392,16 +1387,24 @@
}
gchar*
-gnc_sql_get_sql_value( const GValue* value )
+gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value )
{
if( value != NULL && G_IS_VALUE( value ) ) {
- if( g_value_type_transformable( G_VALUE_TYPE(value), G_TYPE_STRING ) ) {
+ if( G_VALUE_HOLDS_STRING(value) ) {
+ gchar *before_str;
+ gchar* after_str;
+ before_str = g_value_dup_string( value );
+ after_str = gnc_sql_connection_quote_string( conn, before_str );
+ g_free( before_str );
+ return after_str;
+ } else if( g_value_type_transformable( G_VALUE_TYPE(value), G_TYPE_STRING ) ) {
GValue *string;
gchar *str;
string = g_value_init( g_new0( GValue, 1 ), G_TYPE_STRING );
g_value_transform( value, string );
str = g_value_dup_string( string );
+ g_value_unset( string );
g_free( string );
return str;
} else {
@@ -1424,6 +1427,7 @@
GString* sql;
GSList* values;
GSList* node;
+ gchar* sqlbuf;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( table_name != NULL, NULL );
@@ -1431,14 +1435,16 @@
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( table != NULL, NULL );
- sql = g_string_new( g_strdup_printf( "INSERT INTO %s VALUES(", table_name ) );
+ sqlbuf = g_strdup_printf( "INSERT INTO %s VALUES(", table_name );
+ sql = g_string_new( sqlbuf );
+ g_free( sqlbuf );
values = create_gslist_from_values( be, obj_name, pObject, table );
for( node = values; node != NULL; node = node->next ) {
GValue* value = (GValue*)node->data;
if( node != values ) {
g_string_append( sql, "," );
}
- g_string_append( sql, gnc_sql_get_sql_value( value ) );
+ g_string_append( sql, gnc_sql_get_sql_value( be->conn, value ) );
}
g_string_append( sql, ")" );
@@ -1460,6 +1466,7 @@
GList* colname;
gboolean firstCol;
const col_cvt_t* table_row = table;
+ gchar* sqlbuf;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( table_name != NULL, NULL );
@@ -1478,7 +1485,9 @@
values = create_gslist_from_values( be, obj_name, pObject, table );
// Create the SQL statement
- sql = g_string_new( g_strdup_printf( "UPDATE %s SET ", table_name ) );
+ sqlbuf = g_strdup_printf( "UPDATE %s SET ", table_name );
+ sql = g_string_new( sqlbuf );
+ g_free( sqlbuf );
firstCol = TRUE;
for( colname = colnames->next, value = values->next;
@@ -1489,7 +1498,7 @@
}
g_string_append( sql, (gchar*)colname->data );
g_string_append( sql, "=" );
- g_string_append( sql, gnc_sql_get_sql_value( (GValue*)(value->data) ) );
+ g_string_append( sql, gnc_sql_get_sql_value( be->conn, (GValue*)(value->data) ) );
firstCol = FALSE;
}
g_list_free( colnames );
@@ -1514,6 +1523,7 @@
GString* sql;
col_type_handler_t* pHandler;
GSList* list = NULL;
+ gchar* sqlbuf;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( table_name != NULL, NULL );
@@ -1521,8 +1531,9 @@
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( table != NULL, NULL );
- sql = g_string_new( g_strdup_printf( "DELETE FROM %s ", table_name ) );
-
+ sqlbuf = g_strdup_printf( "DELETE FROM %s ", table_name );
+ sql = g_string_new( sqlbuf );
+ g_free( sqlbuf );
stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
/* WHERE */
@@ -1727,7 +1738,6 @@
TABLE_COL_NAME, table_name );
}
(void)gnc_sql_execute_nonselect_sql( be, sql );
- g_free( sql );
}
g_hash_table_insert( be->versions, g_strdup( table_name ), GINT_TO_POINTER(version) );
Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h 2008-06-11 01:18:52 UTC (rev 17211)
@@ -76,6 +76,7 @@
const gchar* (*getColumnTypeName)( GncSqlConnection*, GType, gint size );
void (*createTable)( GncSqlConnection*, const gchar*, const GList* );
void (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const col_cvt_t* );
+ gchar* (*quoteString)( const GncSqlConnection*, gchar* );
};
#define gnc_sql_connection_dispose(CONN) (CONN)->dispose(CONN)
#define gnc_sql_connection_execute_select_statement(CONN,STMT) \
@@ -98,6 +99,8 @@
(CONN)->createTable(CONN,NAME,COLLIST)
#define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
(CONN)->createIndex(CONN,INDEXNAME,TABLENAME,COLTABLE)
+#define gnc_sql_connection_quote_string(CONN,STR) \
+ (CONN)->quoteString(CONN,STR)
struct GncSqlRow
{
@@ -288,7 +291,7 @@
guint gnc_sql_append_guid_list_to_sql( GString* str, GList* list, guint maxCount );
void gnc_sql_add_subtable_colnames_to_list( const col_cvt_t* table_row, const col_cvt_t* subtable,
GList** pList );
-gchar* gnc_sql_get_sql_value( const GValue* value );
+gchar* gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value );
void _retrieve_guid_( gpointer pObject, gpointer pValue );
void gnc_sql_init_version_info( GncSqlBackend* be );
Modified: gnucash/branches/gda-dev2/src/engine/SchedXaction.c
===================================================================
--- gnucash/branches/gda-dev2/src/engine/SchedXaction.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/engine/SchedXaction.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -92,9 +92,8 @@
xaccAccountSetName( sx->template_acct, guid_to_string( guid ));
xaccAccountSetCommodity
(sx->template_acct,
- gnc_commodity_new( book,
- "template", "template",
- "template", "template", 1 ) );
+ gnc_commodity_table_lookup( gnc_commodity_table_get_table(book),
+ "template", "template") );
xaccAccountSetType( sx->template_acct, ACCT_TYPE_BANK );
xaccAccountCommitEdit( sx->template_acct );
ra = gnc_book_get_template_root( book );
Modified: gnucash/branches/gda-dev2/src/engine/gnc-commodity.c
===================================================================
--- gnucash/branches/gda-dev2/src/engine/gnc-commodity.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/engine/gnc-commodity.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -1963,6 +1963,7 @@
gnc_commodity_table_add_default_data(gnc_commodity_table *table, QofBook *book)
{
QofCollection *col;
+ gnc_commodity* c;
ENTER ("table=%p", table);
gnc_commodity_table_add_namespace(table, GNC_COMMODITY_NS_AMEX, book);
@@ -1970,6 +1971,9 @@
gnc_commodity_table_add_namespace(table, GNC_COMMODITY_NS_NASDAQ, book);
gnc_commodity_table_add_namespace(table, GNC_COMMODITY_NS_EUREX, book);
gnc_commodity_table_add_namespace(table, GNC_COMMODITY_NS_MUTUAL, book);
+ gnc_commodity_table_add_namespace(table, "template", book);
+ c = gnc_commodity_new(book, "template", "template", "template", "template", 1);
+ gnc_commodity_table_insert(table, c);
#include "iso-4217-currencies.c"
Modified: gnucash/branches/gda-dev2/src/gnome-utils/gnc-file.c
===================================================================
--- gnucash/branches/gda-dev2/src/gnome-utils/gnc-file.c 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/gnome-utils/gnc-file.c 2008-06-11 01:18:52 UTC (rev 17211)
@@ -166,41 +166,13 @@
response = gtk_dialog_run(GTK_DIALOG(file_box));
if (response == GTK_RESPONSE_ACCEPT) {
- gboolean need_free = FALSE;
-
/* look for constructs like postgres://foo */
internal_name = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER (file_box));
if (strstr (internal_name, "file://") == internal_name) {
- gchar* cur_folder;
- char* colon;
- char* slash;
-
/* nope, a local file name */
internal_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (file_box));
- cur_folder = gtk_file_chooser_get_current_folder( GTK_FILE_CHOOSER( file_box ) );
- if( g_str_has_prefix( internal_name, cur_folder ) ) {
- internal_name += strlen( cur_folder )+1;
-
- /* If there's a ':' before a '/', assume it was from an access method
- * and rearrange the name.
- */
- colon = strstr( internal_name, ":" );
- slash = strstr( internal_name, "/" );
- if( colon != NULL && (slash == NULL || slash > colon) ) {
- const gchar* access_method = internal_name;
- gchar* rest = colon+1;
- *colon = '\0';
-
- internal_name = g_strconcat( access_method, ":",
- cur_folder, "/", rest, NULL );
- need_free = TRUE;
- }
- }
}
file_name = g_strdup(internal_name);
- if( need_free ) {
- g_free( (gchar*)internal_name );
- }
}
gtk_widget_destroy(GTK_WIDGET(file_box));
LEAVE("%s", file_name ? file_name : "(null)");
Modified: gnucash/branches/gda-dev2/src/valgrind-glib.supp
===================================================================
--- gnucash/branches/gda-dev2/src/valgrind-glib.supp 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/valgrind-glib.supp 2008-06-11 01:18:52 UTC (rev 17211)
@@ -48,6 +48,44 @@
fun:g_static_private_set
fun:g_get_filename_charsets
}
+{
+ g_get_tmp_dir leak
+ Memcheck:Leak
+ fun:malloc
+ obj:/lib/tls/i686/cmov/libc-2.7.so
+ fun:__nss_database_lookup
+ obj:*
+ obj:*
+ fun:getpwnam_r
+ obj:*libglib-2.0*
+ fun:g_get_tmp_dir
+}
+{
+ g_option_context_parse leak
+ Memcheck:Leak
+ fun:calloc
+ fun:g_malloc0
+ obj:*libgobject*
+ obj:*libgobject*
+ fun:g_type_init_with_debug_flags
+ fun:g_type_init
+ fun:gdk_pre_parse_libgtk_only
+ obj:*libgtk-x11-2.0*
+ fun:g_option_context_parse
+}
+{
+ g_child_watch_add lean
+ Memcheck:Leak
+ fun:calloc (vg_replace_malloc.c:397)
+ obj:*
+ fun:_dl_allocate_tls
+ fun:pthread_create*
+ obj:*libgthread-2.0*
+ fun:g_thread_create_full
+ obj:*libglib-2.0*
+ fun:g_child_watch_source_new
+ fun:g_child_watch_add_full
+ fun:g_child_watch_add
+}
-
# ##----------------------------------------------------------------------##
Modified: gnucash/branches/gda-dev2/src/valgrind-libguile.supp
===================================================================
--- gnucash/branches/gda-dev2/src/valgrind-libguile.supp 2008-06-10 21:33:07 UTC (rev 17210)
+++ gnucash/branches/gda-dev2/src/valgrind-libguile.supp 2008-06-11 01:18:52 UTC (rev 17211)
@@ -70,5 +70,22 @@
fun:scm_gc_for_newcell
fun:scm_acons
}
+{
+ scm_dynamic_link leak
+ Memcheck:Leak
+ fun:malloc
+ obj:*libguile-ltdl*
+ obj:*libguile-ltdl*
+ obj:*libguile-ltdl*
+ fun:scm_lt_dlopenext
+ fun:scm_dynamic_link
+}
+{
+ scm_deval leak
+ Memcheck:Leak
+ fun:malloc
+ fun:_wrap_*
+ fun:scm_deval
+}
# ##----------------------------------------------------------------------##
More information about the gnucash-changes
mailing list