[Debian-med-packaging] Bug#776814: Patch: use more portable sysconf for memory sizing
Andreas Tille
andreas at an3as.eu
Thu Feb 5 10:27:14 UTC 2015
Hi Jeff,
I added your patch to SVN. The build and test suite are working for me.
Tim, would you volunteer to suggest upstream the patches we just gathered
now in SVN for the different purposes?
I'd love to upload a fixed vsearch quickly but I'd like to hear some
confirmation that everything is fine from users + upstream.
Kind regards
Andreas.
On Wed, Feb 04, 2015 at 10:26:21AM -0600, Jeff Epler wrote:
> Package: vsearch
> Followup-For: Bug #776814
>
> This changes vsearch to use the more portable sysconf API for memory
> sizing. (sysconf is posix, while _SC_PHYS_PAGES is an extension)
>
> While this does change the memory sizing method used on Linux,
> I verified that the results are the same on my Jessie amd64 system:
>
> $ uname -a
> Linux babs 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt2-1 (2014-12-08) x86_64 GNU/Linux
> $ cat memsize.c
> #include <stdio.h>
> #include <sys/sysinfo.h>
> #include <unistd.h>
>
> static
> long long memsize_sysconf() {
> return (long long)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
> }
>
> long long memsize_sysinfo() {
> struct sysinfo si;
> if(sysinfo(&si) < 0) return 0;
> int mem_unit = si.mem_unit ?: 1;
> return (long long)si.totalram * mem_unit;
> }
>
> int main() {
> printf("memsize via sysconf: %16lld\n", memsize_sysconf());
> printf("memsize via sysinfo: %16lld\n", memsize_sysinfo());
> return memsize_sysconf() != memsize_sysinfo();
> }
> $ gcc memsize.c && ./a.out || echo fail
> memsize via sysconf: 8078680064
> memsize via sysinfo: 8078680064
>
> -- System Information:
> Debian Release: 8.0
> APT prefers testing
> APT policy: (990, 'testing'), (500, 'stable'), (1, 'experimental')
> Architecture: kfreebsd-amd64 (x86_64)
>
> Kernel: kFreeBSD 10.1-0-amd64
> Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
> Shell: /bin/sh linked to /bin/dash
> Init: sysvinit (via /sbin/init)
> Description: <short summary of the patch>
> By using the POSIX sysconf(3) together with the nonstandard extension
> _SC_PHYS_PAGES, the system's installed memory can be queried portably on
> Linux and kFreeBSD.
> .
> vsearch (1.0.7+dfsg-1.1) UNRELEASED; urgency=medium
> .
> * Non-maintainer upload.
> * Port to debian kfreebsd (Closes: #776814)
> Author: Jeff Epler <jepler at unpythonic.net>
>
> ---
>
> Bug-Debian: https://bugs.debian.org/776814
> Forwarded: no
> Reviewed-By: <name and email of someone who approved the patch>
> Last-Update: <2015-02-03>
>
> --- vsearch-1.0.7+dfsg.orig/src/arch.cc
> +++ vsearch-1.0.7+dfsg/src/arch.cc
> @@ -21,6 +21,8 @@
>
> #include "vsearch.h"
>
> +#include <unistd.h>
> +
> unsigned long arch_get_memused()
> {
> struct rusage r_usage;
> @@ -44,6 +46,15 @@ unsigned long arch_get_memtotal()
> if(-1 == sysctl(mib, 2, &ram, &length, NULL, 0))
> fatal("Cannot determine amount of RAM");
> return ram;
> +#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
> + long phys_pages = sysconf(_SC_PHYS_PAGES),
> + pagesize = sysconf(_SC_PAGESIZE);
> + // sysconf(3) notes that pagesize * phys_pages can overflow, such as
> + // when long is 32-bits and there's more than 4GB RAM. Since vsearch
> + // apparently targets LP64 systems like x86_64 linux, this will not
> + // arise in practice on the intended platform.
> + if( pagesize > LONG_MAX / phys_pages ) return LONG_MAX;
> + return pagesize * phys_pages;
> #else
> struct sysinfo si;
> if (sysinfo(&si))
> _______________________________________________
> Debian-med-packaging mailing list
> Debian-med-packaging at lists.alioth.debian.org
> http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-packaging
--
http://fam-tille.de
More information about the Debian-med-packaging
mailing list