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,
+									&quoted_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