Re: No need for object file removal before compilation
OK, this issue is much more intricate than it looked like at first. First, the existing code had some bugs: - it removed files too often. After the first compile, we *know* that there are no files to stumble over; if the compiler doesn't know -c -o, then we have moved away $output_obj ourselves. - if the compiler doesn't grok '-c -o', it removed files when it may not remove them: the lockfile and the $output_obj may only be removed with a trap once we've obtained the lock. Further, if $obj = $output_obj, then of course the same holds for $obj. Yuck. OTOH, once we've obtained the lock, we should install that trap ASAP, so that we don't leave a lockfile when interrupted. Then, while I have some doubts about the practical applicability of Bob's scenario, I left the code so that it would be supported: all files we cause to be created are unlinked beforehand, except for the eventual lock file of course. I found another very tiny race: At the very end of func_mode_compile, we remove the eventual lockfile before exiting. If the user happens to interrupt libtool after that, but before exiting, our trap will remove, among others, $output_obj. But that file may already be used by another libtool instance, it could've grabbed the lock already. Fixed by updating $removlist before removing the lockfile. I would have been inclined to ok this one. OK for the updated one? It makes for 5% faster libtool --mode=compile gcc -c a.c Thanks, Ralf 2008-04-12 Ralf Wildenhues [EMAIL PROTECTED] * libltdl/config/ltmain.m4sh (func_mode_compile): Avoid redundant removal of old output files before compilation. Do not remove $obj until we have successfully grabbed the lockfile (in case the compiler doesn't grok `-c -o'), because it might be identical to $output_obj. At the end of the function, before we remove the lockfile, update $removelist so that if the trap hits after the lockfile has been removed, we do not accidentally remove $output_obj that does not belong to us. (func_write_libtool_object): Use $MV instead of mv. Index: libltdl/config/ltmain.m4sh === RCS file: /cvsroot/libtool/libtool/libltdl/config/ltmain.m4sh,v retrieving revision 1.106 diff -u -r1.106 ltmain.m4sh --- libltdl/config/ltmain.m4sh 11 Apr 2008 17:21:55 - 1.106 +++ libltdl/config/ltmain.m4sh 12 Apr 2008 06:55:46 - @@ -650,7 +650,7 @@ non_pic_object=$write_oldobj EOF - mv -f ${write_libobj}T ${write_libobj} + $MV ${write_libobj}T ${write_libobj} } } @@ -831,9 +831,6 @@ removelist=$lobj $libobj ${libobj}T fi -$opt_dry_run || $RM $removelist -trap $opt_dry_run || $RM $removelist; exit $EXIT_FAILURE 1 2 15 - # On Cygwin there's no real PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) @@ -850,8 +847,6 @@ if test $compiler_c_o = no; then output_obj=`$ECHO X$srcfile | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile=$output_obj.lock - removelist=$removelist $output_obj $lockfile - trap $opt_dry_run || $RM $removelist; exit $EXIT_FAILURE 1 2 15 else output_obj= need_locks=no @@ -881,17 +876,20 @@ $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi + removelist=$removelist $output_obj $ECHO $srcfile $lockfile fi +$opt_dry_run || $RM $removelist +removelist=$removelist $lockfile +trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + if test -n $fix_srcfile_path; then eval srcfile=\$fix_srcfile_path\ fi func_quote_for_eval $srcfile qsrcfile=$func_quote_for_eval_result -$opt_dry_run || $RM $libobj ${libobj}T - # Only build a PIC object if we are building libtool libraries. if test $build_libtool_libs = yes; then # Without this assignment, base_compile gets emptied. @@ -911,8 +909,6 @@ command=$command -o $lobj fi - $opt_dry_run || $RM $lobj $output_obj - func_show_eval_locale $command \ 'test -n $output_obj $RM $removelist; exit $EXIT_FAILURE' @@ -962,7 +958,6 @@ # Suppress compiler output if we already did a PIC compilation. command=$command$suppress_output - $opt_dry_run || $RM $obj $output_obj func_show_eval_locale $command \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' @@ -998,6 +993,7 @@ # Unlock the critical section if it was locked if test $need_locks != no; then + removelist=$lockfile $RM $lockfile fi }
Re: No need for object file removal before compilation
* Ralf Wildenhues wrote on Sat, Apr 12, 2008 at 08:56:24AM CEST: OK for the updated one? It makes for 5% faster libtool --mode=compile gcc -c a.c I should be more precise: the above holds for an empty file a.c, measured using a script that calls the above 50 times, pre and post patch. I should also note that this patch introduces an inevitable race (of course all dealing with the no -c -o case): After we grabbed the lockfile, but before we install the trap to remove it, if the user interrupts libtool in between, we have a leftover lockfile. The next compile will barf out, but the error message will point the user towards the lockfile. This is benign, and IMNSHO unavoidable. Cheers, Ralf 2008-04-12 Ralf Wildenhues [EMAIL PROTECTED] * libltdl/config/ltmain.m4sh (func_mode_compile): Avoid redundant removal of old output files before compilation. Do not remove $obj until we have successfully grabbed the lockfile (in case the compiler doesn't grok `-c -o'), because it might be identical to $output_obj. At the end of the function, before we remove the lockfile, update $removelist so that if the trap hits after the lockfile has been removed, we do not accidentally remove $output_obj that does not belong to us. (func_write_libtool_object): Use $MV instead of mv.
Re: No need for object file removal before compilation
On Sat, 12 Apr 2008, Ralf Wildenhues wrote: Then, while I have some doubts about the practical applicability of Bob's scenario, I left the code so that it would be supported: all Bob's scenarios are rarely practical. I would have been inclined to ok this one. OK for the updated one? It makes for 5% faster libtool --mode=compile gcc -c a.c The patch looks ok to me. We shall see about the actual performance improvement. Bob Thanks, Ralf 2008-04-12 Ralf Wildenhues [EMAIL PROTECTED] * libltdl/config/ltmain.m4sh (func_mode_compile): Avoid redundant removal of old output files before compilation. Do not remove $obj until we have successfully grabbed the lockfile (in case the compiler doesn't grok `-c -o'), because it might be identical to $output_obj. At the end of the function, before we remove the lockfile, update $removelist so that if the trap hits after the lockfile has been removed, we do not accidentally remove $output_obj that does not belong to us. (func_write_libtool_object): Use $MV instead of mv. Index: libltdl/config/ltmain.m4sh === RCS file: /cvsroot/libtool/libtool/libltdl/config/ltmain.m4sh,v retrieving revision 1.106 diff -u -r1.106 ltmain.m4sh --- libltdl/config/ltmain.m4sh 11 Apr 2008 17:21:55 - 1.106 +++ libltdl/config/ltmain.m4sh 12 Apr 2008 06:55:46 - @@ -650,7 +650,7 @@ non_pic_object=$write_oldobj EOF - mv -f ${write_libobj}T ${write_libobj} + $MV ${write_libobj}T ${write_libobj} } } @@ -831,9 +831,6 @@ removelist=$lobj $libobj ${libobj}T fi -$opt_dry_run || $RM $removelist -trap $opt_dry_run || $RM $removelist; exit $EXIT_FAILURE 1 2 15 - # On Cygwin there's no real PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) @@ -850,8 +847,6 @@ if test $compiler_c_o = no; then output_obj=`$ECHO X$srcfile | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile=$output_obj.lock - removelist=$removelist $output_obj $lockfile - trap $opt_dry_run || $RM $removelist; exit $EXIT_FAILURE 1 2 15 else output_obj= need_locks=no @@ -881,17 +876,20 @@ $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi + removelist=$removelist $output_obj $ECHO $srcfile $lockfile fi +$opt_dry_run || $RM $removelist +removelist=$removelist $lockfile +trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + if test -n $fix_srcfile_path; then eval srcfile=\$fix_srcfile_path\ fi func_quote_for_eval $srcfile qsrcfile=$func_quote_for_eval_result -$opt_dry_run || $RM $libobj ${libobj}T - # Only build a PIC object if we are building libtool libraries. if test $build_libtool_libs = yes; then # Without this assignment, base_compile gets emptied. @@ -911,8 +909,6 @@ command=$command -o $lobj fi - $opt_dry_run || $RM $lobj $output_obj - func_show_eval_locale $command\ 'test -n $output_obj $RM $removelist; exit $EXIT_FAILURE' @@ -962,7 +958,6 @@ # Suppress compiler output if we already did a PIC compilation. command=$command$suppress_output - $opt_dry_run || $RM $obj $output_obj func_show_eval_locale $command \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' @@ -998,6 +993,7 @@ # Unlock the critical section if it was locked if test $need_locks != no; then + removelist=$lockfile $RM $lockfile fi } == Bob Friesenhahn [EMAIL PROTECTED], http://www.simplesystems.org/users/bfriesen/ GraphicsMagick Maintainer,http://www.GraphicsMagick.org/
switching to git, please no more CVS commits
Hello, please do not commit to CVS for now, until further notification. Thanks, Ralf