http://bugs.gentoo.org/show_bug.cgi?id=83379

Author: Zac Medico

This patch uses prelink --undo-output=prelink_tmpfile in order to avoid extra 
copying.  Files rejected by prelink are checksummed in place.  With this patch 
applied, I have measured a 7.75% decrease in the time taken to checksum non-elf 
files when prelink is enabled.

Comments?

Zac
Index: portage-2.0.51.22/pym/portage_checksum.py
===================================================================
--- portage-2.0.51.22.orig/pym/portage_checksum.py
+++ portage-2.0.51.22/pym/portage_checksum.py
@@ -111,24 +111,18 @@ def perform_checksum(filename, hash_func
 	
 	if calc_prelink and prelink_capable:
 		mylock = portage_locks.lockfile(prelink_tmpfile, wantnewlockfile=1)
-		# Create non-prelinked temporary file to md5sum.
-		# Raw data is returned on stdout, errors on stderr.
-		# Non-prelinks are just returned.
-		try:
-			shutil.copy2(filename,prelink_tmpfile)
-		except SystemExit, e:
-			raise
-		except Exception,e:
-			portage_util.writemsg("!!! Unable to copy file '"+str(filename)+"'.\n")
-			portage_util.writemsg("!!! "+str(e)+"\n")
-			sys.exit(1)
-		portage_exec.spawn(PRELINK_BINARY+" --undo "+prelink_tmpfile,fd_pipes={})
-		myfilename=prelink_tmpfile
+		# Create non-prelinked temporary file to checksum.
+		# Files rejected by prelink are summed in place.
+		retval=portage_exec.spawn([PRELINK_BINARY,"--undo","-o",prelink_tmpfile,filename],fd_pipes={})
+		if retval==0:
+			#portage_util.writemsg(">>> prelink checksum '"+str(filename)+"'.\n")
+			myfilename=prelink_tmpfile
 
 	myhash, mysize = hash_function(myfilename)
 
 	if calc_prelink and prelink_capable:
-		os.unlink(prelink_tmpfile)
+		if os.path.exists(prelink_tmpfile):
+			os.unlink(prelink_tmpfile)
 		portage_locks.unlockfile(mylock)
 
 	return (myhash,mysize)

Reply via email to