You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2009/12/03 01:19:58 UTC
svn commit: r886346 - in /lucene/lucy/trunk: devel/bin/
devel/bin/valgrind_triggers.pl devel/conf/ devel/conf/lucyperl.supp
perl/buildlib/Lucy/Build.pm
Author: marvin
Date: Thu Dec 3 00:19:57 2009
New Revision: 886346
URL: http://svn.apache.org/viewvc?rev=886346&view=rev
Log:
Commit LUCY-80, adding a "test_valgrind" build target for Lucy's Perl
bindings.
Added:
lucene/lucy/trunk/devel/bin/
lucene/lucy/trunk/devel/bin/valgrind_triggers.pl (with props)
lucene/lucy/trunk/devel/conf/
lucene/lucy/trunk/devel/conf/lucyperl.supp
Modified:
lucene/lucy/trunk/perl/buildlib/Lucy/Build.pm
Added: lucene/lucy/trunk/devel/bin/valgrind_triggers.pl
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/devel/bin/valgrind_triggers.pl?rev=886346&view=auto
==============================================================================
--- lucene/lucy/trunk/devel/bin/valgrind_triggers.pl (added)
+++ lucene/lucy/trunk/devel/bin/valgrind_triggers.pl Thu Dec 3 00:19:57 2009
@@ -0,0 +1,7 @@
+# This file is used by the test_valgrind build target to generate a list of
+# suppressions.
+use strict;
+use warnings;
+use Time::HiRes;
+use Data::Dumper; # triggers XSLoader
+
Propchange: lucene/lucy/trunk/devel/bin/valgrind_triggers.pl
------------------------------------------------------------------------------
svn:eol-style = native
Added: lucene/lucy/trunk/devel/conf/lucyperl.supp
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/devel/conf/lucyperl.supp?rev=886346&view=auto
==============================================================================
--- lucene/lucy/trunk/devel/conf/lucyperl.supp (added)
+++ lucene/lucy/trunk/devel/conf/lucyperl.supp Thu Dec 3 00:19:57 2009
@@ -0,0 +1,161 @@
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_CB_new_from_trusted_utf8
+ fun:lucy_CB_clone
+ fun:lucy_Hash_make_key
+ fun:lucy_Hash_do_store
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:calloc
+ fun:lucy_Memory_wrapped_calloc
+ fun:lucy_VTable_make_obj
+ fun:lucy_Hash_new
+ fun:lucy_VTable_init_registry
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_Hash_do_store
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:calloc
+ fun:lucy_Memory_wrapped_calloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_CB_new_from_trusted_utf8
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+
+{
+ <Snowball XS constructor>
+ Memcheck:Leak
+ fun:calloc
+ fun:Perl_safesyscalloc
+ fun:XS_Lingua__Stem__Snowball__Stemmifier_new
+ fun:*
+}
+
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:calloc
+ fun:lucy_Memory_wrapped_calloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:malloc
+ fun:lucy_Memory_wrapped_malloc
+ fun:lucy_CB_new_from_trusted_utf8
+ fun:lucy_Hash_store
+ fun:lucy_VTable_add_to_registry
+ fun:lucy_Lucy_bootstrap
+ fun:boot_Lucy
+ fun:*
+}
+
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:calloc
+ fun:lucy_Memory_wrapped_calloc
+ fun:lucy_Hash_do_store
+ fun:lucy_Hash_store
+ fun:lucy_VTable_singleton
+ fun:*
+}
+
+{
+ <insert a suppression name here>
+ Memcheck:Leak
+ fun:calloc
+ fun:lucy_Memory_wrapped_calloc
+ fun:lucy_Hash_rebuild_hash
+ fun:*
+}
+
Modified: lucene/lucy/trunk/perl/buildlib/Lucy/Build.pm
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/perl/buildlib/Lucy/Build.pm?rev=886346&r1=886345&r2=886346&view=diff
==============================================================================
--- lucene/lucy/trunk/perl/buildlib/Lucy/Build.pm (original)
+++ lucene/lucy/trunk/perl/buildlib/Lucy/Build.pm Thu Dec 3 00:19:57 2009
@@ -345,6 +345,102 @@
Devel::PPPort::WriteFile();
}
+sub ACTION_suppressions {
+ my $self = shift;
+ my $LOCAL_SUPP = 'local.supp';
+ return
+ if $self->up_to_date( '../devel/bin/valgrind_triggers.pl',
+ $LOCAL_SUPP );
+
+ # Generate suppressions.
+ print "Writing $LOCAL_SUPP...\n";
+ $self->add_to_cleanup($LOCAL_SUPP);
+ my $command
+ = "yes | "
+ . $self->_valgrind_base_command
+ . "--gen-suppressions=yes "
+ . $self->perl
+ . " ../devel/bin/valgrind_triggers.pl 2>&1";
+ my $suppressions = `$command`;
+ $suppressions =~ s/^==.*?\n//mg;
+ my $rule_number = 1;
+ while ( $suppressions =~ /<insert a.*?>/ ) {
+ $suppressions =~ s/^\s*<insert a.*?>/{\n <core_perl_$rule_number>/m;
+ $rule_number++;
+ }
+
+ # Write local suppressions file.
+ open( my $supp_fh, '>', $LOCAL_SUPP )
+ or confess("Can't open '$LOCAL_SUPP': $!");
+ print $supp_fh $suppressions;
+}
+
+sub _valgrind_base_command {
+ return
+ "PERL_DESTRUCT_LEVEL=2 LUCY_VALGRIND=1 valgrind "
+ . "--leak-check=yes "
+ . "--show-reachable=yes "
+ . "--num-callers=10 "
+ . "--suppressions=../devel/conf/lucyperl.supp ";
+}
+
+sub ACTION_test_valgrind {
+ my $self = shift;
+ die "Must be run under a perl that was compiled with -DDEBUGGING"
+ unless $Config{ccflags} =~ /-D?DEBUGGING\b/;
+ $self->dispatch('code');
+ $self->dispatch('suppressions');
+
+ # Unbuffer STDOUT, grab test file names and suppressions files.
+ $|++;
+ my $t_files = $self->find_test_files; # not public M::B API, may fail
+ my $valgrind_command = $self->_valgrind_base_command;
+ $valgrind_command .= "--suppressions=local.supp ";
+
+ if ( my $local_supp = $self->args('suppressions') ) {
+ for my $supp ( split( ',', $local_supp ) ) {
+ $valgrind_command .= "--suppressions=$supp ";
+ }
+ }
+
+ # Iterate over test files.
+ my @failed;
+ for my $t_file (@$t_files) {
+
+ # Run test file under Valgrind.
+ print "Testing $t_file...";
+ die "Can't find '$t_file'" unless -f $t_file;
+ my $command = "$valgrind_command $^X -Mblib $t_file 2>&1";
+ my $output = "\n" . ( scalar localtime(time) ) . "\n$command\n";
+ $output .= `$command`;
+
+ # Screen-scrape Valgrind output, looking for errors and leaks.
+ if ( $?
+ or $output =~ /ERROR SUMMARY:\s+[^0\s]/
+ or $output =~ /definitely lost:\s+[^0\s]/
+ or $output =~ /possibly lost:\s+[^0\s]/
+ or $output =~ /still reachable:\s+[^0\s]/ )
+ {
+ print " failed.\n";
+ push @failed, $t_file;
+ print "$output\n";
+ }
+ else {
+ print " succeeded.\n";
+ }
+ }
+
+ # If there are failed tests, print a summary list.
+ if (@failed) {
+ print "\nFailed "
+ . scalar @failed . "/"
+ . scalar @$t_files
+ . " test files:\n "
+ . join( "\n ", @failed ) . "\n";
+ exit(1);
+ }
+}
+
sub ACTION_compile_custom_xs {
my $self = shift;
my $xs_filepath = $self->xs_filepath;