bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-gnulib] same.c optimization


From: Bruno Haible
Subject: [Bug-gnulib] same.c optimization
Date: Tue, 14 Jan 2003 13:39:07 +0100 (CET)

Hi Jim,

Here is a proposed change to same.c. It doesn't change anything of the
semantics, but it will avoid stat() when not needed, by doing first the
checks which don't need system calls, and then only the checks which call
stat(). What do you think?


2003-01-11  Bruno Haible  <address@hidden>

        * same.c (same_name): Reorder tests so as to avoid calling stat()
        when a string comparison is sufficient.

diff -r -c3 --exclude=MODULES.html gnulib-cvs/lib/same.c gnulib/lib/same.c
*** gnulib-cvs/lib/same.c       2002-11-05 17:50:29.000000000 +0100
--- gnulib/lib/same.c   2003-01-12 01:27:37.000000000 +0100
***************
*** 1,5 ****
  /* Determine whether two file names refer to the same file.
!    Copyright (C) 1997-2000, 2002 Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
--- 1,5 ----
  /* Determine whether two file names refer to the same file.
!    Copyright (C) 1997-2000, 2002-2003 Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
***************
*** 70,100 ****
    char *source_basename, *dest_basename;
    size_t source_baselen, dest_baselen;
  
!   source_dirname = dir_name (source);
!   dest_dirname = dir_name (dest);
! 
!   if (stat (source_dirname, &source_dir_stats))
!     {
!       /* Shouldn't happen.  */
!       error (1, errno, "%s", source_dirname);
!     }
! 
!   if (stat (dest_dirname, &dest_dir_stats))
!     {
!       /* Shouldn't happen.  */
!       error (1, errno, "%s", dest_dirname);
!     }
! 
!   free (source_dirname);
!   free (dest_dirname);
! 
!   if (! SAME_INODE (source_dir_stats, dest_dir_stats))
!     return 0;
! 
    source_basename = base_name (source);
    dest_basename = base_name (dest);
    source_baselen = base_len (source_basename);
    dest_baselen = base_len (dest_basename);
!   return (source_baselen == dest_baselen
!         && memcmp (source_basename, dest_basename, dest_baselen) == 0);
  }
--- 70,105 ----
    char *source_basename, *dest_basename;
    size_t source_baselen, dest_baselen;
  
!   /* Compare the basenames.  */
    source_basename = base_name (source);
    dest_basename = base_name (dest);
    source_baselen = base_len (source_basename);
    dest_baselen = base_len (dest_basename);
!   if (source_baselen == dest_baselen
!       && memcmp (source_basename, dest_basename, dest_baselen) == 0)
!     {
!       /* Compare the directories.  */
!       source_dirname = dir_name (source);
!       dest_dirname = dir_name (dest);
! 
!       if (stat (source_dirname, &source_dir_stats))
!       {
!         /* Shouldn't happen.  */
!         error (1, errno, "%s", source_dirname);
!       }
! 
!       if (stat (dest_dirname, &dest_dir_stats))
!       {
!         /* Shouldn't happen.  */
!         error (1, errno, "%s", dest_dirname);
!       }
! 
!       free (source_dirname);
!       free (dest_dirname);
! 
!       if (SAME_INODE (source_dir_stats, dest_dir_stats))
!       return 1;
!     }
! 
!   return 0;
  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]