1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-10-12 19:04:54 +03:00

Expand comments in Linux times() implementation.

This commit is contained in:
Carlos O'Donell
2016-06-19 15:46:26 -04:00
parent 43c2948756
commit e3c0687de1
2 changed files with 21 additions and 10 deletions

View File

@@ -29,11 +29,13 @@ __times (struct tms *buf)
&& __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)
&& buf)
{
/* This might be an error or not. For architectures which have
no separate return value and error indicators we cannot
distinguish a return value of -1 from an error. Do it the
hard way. We crash applications which pass in an invalid
non-NULL BUF pointer. Linux allows BUF to be NULL. */
/* This might be an error or not. For architectures which have no
separate return value and error indicators we cannot
distinguish a return value of e.g. (clock_t) -14 from -EFAULT.
Therefore the only course of action is to dereference the user
-supplied structure on a return of (clock_t) -14. This will crash
applications which pass in an invalid non-NULL BUF pointer.
Note that Linux allows BUF to be NULL in which case we skip this. */
#define touch(v) \
do { \
clock_t temp = v; \
@@ -45,13 +47,18 @@ __times (struct tms *buf)
touch (buf->tms_cutime);
touch (buf->tms_cstime);
/* If we come here the memory is valid (or BUF is NULL, which is
a valid condition for the kernel syscall) and the kernel did not
return an EFAULT error. Return the value given by the kernel. */
/* If we come here the memory is valid and the kernel did not
return an EFAULT error, but rather e.g. (clock_t) -14.
Return the value given by the kernel. */
}
/* Return value (clock_t) -1 signals an error, but if there wasn't any,
return the following value. */
/* On Linux this function never fails except with EFAULT.
POSIX says that returning a value (clock_t) -1 indicates an error,
but on Linux this is simply one of the valid clock values after
clock_t wraps. Therefore when we would return (clock_t) -1, we
instead return (clock_t) 0, and loose a tick of accuracy (having
returned 0 for two consecutive calls even though the clock
advanced). */
if (ret == (clock_t) -1)
return (clock_t) 0;