bug-gnulib
[Top][All Lists]
Advanced

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

Port getloadavg to cygwin


From: Eric Blake
Subject: Port getloadavg to cygwin
Date: Fri, 08 Jul 2005 21:03:03 +0000

Cygwin emulates Linux's /proc/loadavg (although, so far, its contents
are the constant string "0.00 0.00 0.00\n", because no one has found
an easy way to get Windows to report accurate numbers.)  We might
as well read this file in case a future version of cygwin can change the
contents of the virtual file.  I don't know if it is worth renaming
LINUX_LDAV_FILE to something more accurate.

While porting this, I noticed that the ldavgbuf[] was underallocated:
it neglected room for the space between entries, as well as a trailing
nul, so although skipping the trailing \n is okay, the read() of three
maximum length fields would chop off the fractional part of the third
entry.  (This is only theoretical, since when have you ever seen a
computer with a load high enough to be INT_STRLEN_BOUND(long int)
characters?)

I also noticed when compiling with gcc -Wall, that on platforms without
a current port, the variable elem was unused when everything falls through
to the final #if !defined LDAV_DONE.

2005-07-08  Eric Blake  <address@hidden>  (tiny change)

        * getloadavg.c (getloadavg) [__CYGWIN__]: Port to cygwin.
        [__linux__]: Allocate a big enough buffer for /proc/loadavg.
        [!LDAV_DONE]: Avoid unused variable warning.

--- lib/getloadavg.c    3 Jul 2005 07:14:28 -0000       1.33
+++ lib/getloadavg.c    8 Jul 2005 20:53:46 -0000
@@ -47,7 +47,8 @@
                                the nlist n_name element is a pointer,
                                not an array.
    HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'.
-   LINUX_LDAV_FILE             [__linux__]: File containing load averages.
+   LINUX_LDAV_FILE             [__linux__, __CYGWIN__]: File containing
+                               load averages.
 
    Specific system predefines this file uses, aside from setting
    default values if not emacs:
@@ -70,6 +71,7 @@
    WINDOWS32                   No-op for Windows95/NT.
    __linux__                   Linux: assumes /proc file system mounted.
                                Support from Michael K. Johnson.
+   __CYGWIN__                  Cygwin emulates linux /proc/loadavg.
    __NetBSD__                  NetBSD: assumes /kern file system mounted.
 
    In addition, to avoid nesting many #ifdefs, we internally set
@@ -563,7 +565,7 @@
 
 # endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
 
-# if !defined (LDAV_DONE) && defined (__linux__)
+# if !defined (LDAV_DONE) && (defined (__linux__) || defined (__CYGWIN__))
 #  define LDAV_DONE
 #  undef LOAD_AVE_TYPE
 
@@ -571,7 +573,7 @@
 #   define LINUX_LDAV_FILE "/proc/loadavg"
 #  endif
 
-  char ldavgbuf[3 * (INT_STRLEN_BOUND (long int) + sizeof ".00")];
+  char ldavgbuf[3 * (INT_STRLEN_BOUND (long int) + sizeof ".00 ")];
   char const *ptr = ldavgbuf;
   int fd, count;
 
@@ -600,7 +602,7 @@
 
   return elem;
 
-# endif /* __linux__ */
+# endif /* __linux__ || __CYGWIN__ */
 
 # if !defined (LDAV_DONE) && defined (__NetBSD__)
 #  define LDAV_DONE
@@ -964,14 +966,13 @@
 #  define LDAV_DONE
 # endif /* !LDAV_DONE && LOAD_AVE_TYPE */
 
-# ifdef LDAV_DONE
-  return elem;
-# else
+# if !defined LDAV_DONE
   /* Set errno to zero to indicate that there was no particular error;
      this function just can't work at all on this system.  */
   errno = 0;
-  return -1;
+  elem = -1;
 # endif
+  return elem;
 }
 
 #endif /* ! HAVE_GETLOADAVG */


--
Eric Blake




reply via email to

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