Mercurial > hg > octave-lojdl > gnulib-hg
view lib/times.c @ 14578:4e83bc0de9e4
Support non-blocking pipe I/O in write() on native Windows.
* lib/unistd.in.h (write): Enable replacement also if
GNULIB_UNISTD_H_NONBLOCKING is 1.
* lib/write.c: Enable replacement also if GNULIB_NONBLOCKING.
(rpl_write): When failing to write on a non-blocking pipe, change
errno from ENOSPC to EAGAIN.
* lib/stdio.in.h (fprintf, fputc, fputs, fwrite, printf, putc,
putchar, puts, vfprintf, vprintf): Enable replacement also if
GNULIB_STDIO_H_NONBLOCKING is 1.
* lib/stdio-write.c: Enable replacements also if GNULIB_NONBLOCKING.
(CLEAR_ERRNO, HANDLE_ENOSPC): New macros.
(CLEAR_LastError, HANDLE_ERROR_NO_DATA): New macros, extracted from
CALL_WITH_SIGPIPE_EMULATION.
(CALL_WITH_SIGPIPE_EMULATION): Use them.
* m4/nonblocking.m4: New file.
* m4/write.m4 (gl_FUNC_WRITE): Enable REPLACE_WRITE also if required
for non-blocking I/O support.
* m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
GNULIB_UNISTD_H_NONBLOCKING.
* m4/stdio_h.m4 (gl_STDIO_H): Enable REPLACE_STDIO_WRITE_FUNCS also if
required for non-blocking I/O support.
(gl_STDIO_H_DEFAULTS): Initialize GNULIB_STDIO_H_NONBLOCKING.
* modules/nonblocking (Files): Add m4/nonblocking.m4,
lib/stdio-write.c, m4/asm-underscore.m4.
(Depends-on): Add stdio, unistd.
(configure.ac): Invoke gl_NONBLOCKING_IO. Define GNULIB_NONBLOCKING.
Set GNULIB_STDIO_H_NONBLOCKING, GNULIB_UNISTD_H_NONBLOCKING.
* modules/unistd (Makefile.am): Substitute GNULIB_UNISTD_H_NONBLOCKING.
* modules/stdio (Makefile.am): Substitute GNULIB_STDIO_H_NONBLOCKING.
* doc/posix-functions/fprintf.texi: Mention 'nonblocking' module and
problem with non-blocking pipes.
* doc/posix-functions/fputc.texi: Likewise.
* doc/posix-functions/fputs.texi: Likewise.
* doc/posix-functions/fwrite.texi: Likewise.
* doc/posix-functions/printf.texi: Likewise.
* doc/posix-functions/putc.texi: Likewise.
* doc/posix-functions/putchar.texi: Likewise.
* doc/posix-functions/puts.texi: Likewise.
* doc/posix-functions/vfprintf.texi: Likewise.
* doc/posix-functions/vprintf.texi: Likewise.
* doc/posix-functions/write.texi: Likewise.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Wed, 13 Apr 2011 12:15:43 +0200 |
parents | 97fc9a21a8fb |
children | 8250f2777afc |
line wrap: on
line source
/* Get process times Copyright (C) 2008-2011 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 the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Simon Josefsson <simon@josefsson.org>, 2008. */ #include <config.h> /* Get times prototype. */ #include <sys/times.h> /* Get round. */ #include <math.h> /* Get GetProcessTimes etc. */ #include <windows.h> static clock_t filetime2clock (FILETIME time) { float f; /* We have a 64-bit value, in the form of two DWORDS aka unsigned int, counting the number of 100-nanosecond intervals. We need to convert these to clock ticks. Older POSIX uses CLK_TCK to indicate the number of clock ticks per second while modern POSIX uses sysconf(_SC_CLK_TCK). Mingw32 does not appear to have sysconf(_SC_CLK_TCK), but appears to have CLK_TCK = 1000 so we use it. Note that CLOCKS_PER_SEC constant does not apply here, it is for use with the clock function. */ f = (unsigned long long) time.dwHighDateTime << 32; f += time.dwLowDateTime; f = f * CLK_TCK / 10000000; return (clock_t) round (f); } clock_t times (struct tms * buffer) { FILETIME creation_time, exit_time, kernel_time, user_time; if (GetProcessTimes (GetCurrentProcess (), &creation_time, &exit_time, &kernel_time, &user_time) == 0) return (clock_t) -1; buffer->tms_utime = filetime2clock (user_time); buffer->tms_stime = filetime2clock (kernel_time); buffer->tms_cutime = 0; buffer->tms_cstime = 0; return filetime2clock (creation_time); }