Patch 7.0.236
Problem:    Linux 2.4 uses sysinfo() with a mem_unit field, which is not
            backwards compatible.
Solution:   Add an autoconf check for sysinfo.mem_unit.  Let mch_total_mem()
            return Kbyte to avoid overflow.
Files:      src/auto/configure, src/configure.in, src/config.h.in,
            src/option.c, src/os_unix.c


*** ../vim-7.0.235/src/auto/configure   Tue Oct 17 11:50:45 2006
--- src/auto/configure  Thu Apr 26 16:44:07 2007
***************
*** 13685,13690 ****
--- 13685,13746 ----
  
  echo "$as_me:$LINENO: result: not usable" >&5
  echo "${ECHO_T}not usable" >&6
+ fi
+ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ 
+ echo "$as_me:$LINENO: checking for sysinfo.mem_unit" >&5
+ echo $ECHO_N "checking for sysinfo.mem_unit... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+ _ACEOF
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ #include <sys/types.h>
+ #include <sys/sysinfo.h>
+ int
+ main ()
+ {
+       struct sysinfo sinfo;
+       sinfo.mem_unit = 1;
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ rm -f conftest.$ac_objext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+   (eval $ac_compile) 2>conftest.er1
+   ac_status=$?
+   grep -v '^ *+' conftest.er1 >conftest.err
+   rm -f conftest.er1
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+   (eval $ac_try) 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+   (eval $ac_try) 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; }; then
+   echo "$as_me:$LINENO: result: yes" >&5
+ echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF
+ #define HAVE_SYSINFO_MEM_UNIT 1
+ _ACEOF
+ 
+ else
+   echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+ 
+ echo "$as_me:$LINENO: result: no" >&5
+ echo "${ECHO_T}no" >&6
  fi
  rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
  
*** ../vim-7.0.235/src/configure.in     Tue Oct 17 11:50:45 2006
--- src/configure.in    Thu Apr 26 16:40:18 2007
***************
*** 2589,2594 ****
--- 2589,2605 ----
        ],
        AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSINFO),
        AC_MSG_RESULT(not usable))
+ 
+ dnl struct sysinfo may have the mem_unit field or not
+ AC_MSG_CHECKING(for sysinfo.mem_unit)
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+ #include <sys/sysinfo.h>],
+ [     struct sysinfo sinfo;
+       sinfo.mem_unit = 1;
+       ],
+       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSINFO_MEM_UNIT),
+       AC_MSG_RESULT(no))
  
  dnl sysconf() may exist but not support what we want to use
  AC_MSG_CHECKING(for sysconf)
*** ../vim-7.0.235/src/config.h.in      Fri Apr 21 00:11:09 2006
--- src/config.h.in     Thu Apr 26 16:40:34 2007
***************
*** 176,181 ****
--- 176,182 ----
  #undef HAVE_SYSCONF
  #undef HAVE_SYSCTL
  #undef HAVE_SYSINFO
+ #undef HAVE_SYSINFO_MEM_UNIT
  #undef HAVE_TGETENT
  #undef HAVE_TOWLOWER
  #undef HAVE_TOWUPPER
*** ../vim-7.0.235/src/option.c Fri Mar  2 20:00:06 2007
--- src/option.c        Tue May  1 13:26:10 2007
***************
*** 3030,3036 ****
  #else
  # ifdef HAVE_TOTAL_MEM
            /* Use amount of memory available to Vim. */
!           n = (mch_total_mem(FALSE) >> 11);
  # else
            n = (0x7fffffff >> 11);
  # endif
--- 3030,3036 ----
  #else
  # ifdef HAVE_TOTAL_MEM
            /* Use amount of memory available to Vim. */
!           n = (mch_total_mem(FALSE) >> 1);
  # else
            n = (0x7fffffff >> 11);
  # endif
*** ../vim-7.0.235/src/os_unix.c        Thu Apr 26 16:28:43 2007
--- src/os_unix.c       Thu Apr 26 16:37:43 2007
***************
*** 428,435 ****
  # endif
  
  /*
!  * Return total amount of memory available.  Doesn't change when memory has
!  * been allocated.
   */
  /* ARGSUSED */
      long_u
--- 428,435 ----
  # endif
  
  /*
!  * Return total amount of memory available in Kbyte.
!  * Doesn't change when memory has been allocated.
   */
  /* ARGSUSED */
      long_u
***************
*** 437,445 ****
      int special;
  {
  # ifdef __EMX__
!     return ulimit(3, 0L);   /* always 32MB? */
  # else
      long_u    mem = 0;
  
  #  ifdef HAVE_SYSCTL
      int               mib[2], physmem;
--- 437,446 ----
      int special;
  {
  # ifdef __EMX__
!     return ulimit(3, 0L) >> 10;   /* always 32MB? */
  # else
      long_u    mem = 0;
+     long_u    shiftright = 10;  /* how much to shift "mem" right for Kbyte */
  
  #  ifdef HAVE_SYSCTL
      int               mib[2], physmem;
***************
*** 460,466 ****
--- 461,479 ----
  
        /* Linux way of getting amount of RAM available */
        if (sysinfo(&sinfo) == 0)
+       {
+ #   ifdef HAVE_SYSINFO_MEM_UNIT
+           /* avoid overflow as much as possible */
+           while (shiftright > 0 && (sinfo.mem_unit & 1) == 0)
+           {
+               sinfo.mem_unit = sinfo.mem_unit >> 1;
+               --shiftright;
+           }
+           mem = sinfo.totalram * sinfo.mem_unit;
+ #   else
            mem = sinfo.totalram;
+ #   endif
+       }
      }
  #  endif
  
***************
*** 473,479 ****
--- 486,500 ----
        pagesize = sysconf(_SC_PAGESIZE);
        pagecount = sysconf(_SC_PHYS_PAGES);
        if (pagesize > 0 && pagecount > 0)
+       {
+           /* avoid overflow as much as possible */
+           while (shiftright > 0 && (pagesize & 1) == 0)
+           {
+               pagesize = pagesize >> 1;
+               --shiftright;
+           }
            mem = (long_u)pagesize * pagecount;
+       }
      }
  #  endif
  
***************
*** 488,502 ****
  #   ifdef RLIM_INFINITY
                && rlp.rlim_cur != RLIM_INFINITY
  #   endif
!               && (long_u)rlp.rlim_cur < mem
           )
!           return (long_u)rlp.rlim_cur;
      }
  #  endif
  
      if (mem > 0)
!       return mem;
!     return (long_u)0x7fffffff;
  # endif
  }
  #endif
--- 509,526 ----
  #   ifdef RLIM_INFINITY
                && rlp.rlim_cur != RLIM_INFINITY
  #   endif
!               && ((long_u)rlp.rlim_cur >> 10) < (mem >> shiftright)
           )
!       {
!           mem = (long_u)rlp.rlim_cur;
!           shiftright = 10;
!       }
      }
  #  endif
  
      if (mem > 0)
!       return mem >> shiftright;
!     return (long_u)0x1fffff;
  # endif
  }
  #endif
*** ../vim-7.0.235/src/version.c        Sun Apr 29 13:55:43 2007
--- src/version.c       Tue May  1 13:32:44 2007
***************
*** 668,669 ****
--- 668,671 ----
  {   /* Add new patch number below this line */
+ /**/
+     236,
  /**/

-- 
A day without sunshine is like, well, night.

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

Reply via email to