annotate lib/getrusage.c @ 40196:e63f5d3edab5

relocatable-prog: Update documentation. * doc/relocatable-maint.texi (Supporting Relocation): Update to match the recent changes.
author Bruno Haible <bruno@clisp.org>
date Sun, 24 Feb 2019 01:49:15 +0100
parents b06060465f09
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16777
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* getrusage replacement for systems which lack it.
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19595
diff changeset
3 Copyright (C) 2012-2019 Free Software Foundation, Inc.
16777
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 (at your option) any later version.
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
19190
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
16777
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18 /* Written by Bruno Haible, 2012. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 #include <config.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 /* Specification. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 #include <sys/resource.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <errno.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <string.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 /* Get uint64_t. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #include <stdint.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30
19595
beb2ad957aca Simplify code. Drop support for Borland C++ on Windows.
Bruno Haible <bruno@clisp.org>
parents: 19484
diff changeset
31 #if defined _WIN32 && ! defined __CYGWIN__
16777
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 # define WIN32_LEAN_AND_MEAN
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 # include <windows.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 #else
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 # include <sys/times.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 # include <unistd.h>
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 #endif
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 int
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 getrusage (int who, struct rusage *usage_p)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 if (who == RUSAGE_SELF || who == RUSAGE_CHILDREN)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 /* Clear all unsupported members of 'struct rusage'. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 memset (usage_p, '\0', sizeof (struct rusage));
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49
19595
beb2ad957aca Simplify code. Drop support for Borland C++ on Windows.
Bruno Haible <bruno@clisp.org>
parents: 19484
diff changeset
50 #if defined _WIN32 && ! defined __CYGWIN__
16777
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 if (who == RUSAGE_SELF)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 /* Fill in the ru_utime and ru_stime members. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 FILETIME creation_time;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 FILETIME exit_time;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 FILETIME kernel_time;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 FILETIME user_time;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 if (GetProcessTimes (GetCurrentProcess (),
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 &creation_time, &exit_time,
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 &kernel_time, &user_time))
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 /* Convert to microseconds, rounding. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 uint64_t kernel_usec =
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 ((((uint64_t) kernel_time.dwHighDateTime << 32)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 | (uint64_t) kernel_time.dwLowDateTime)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 + 5) / 10;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 uint64_t user_usec =
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 ((((uint64_t) user_time.dwHighDateTime << 32)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 | (uint64_t) user_time.dwLowDateTime)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 + 5) / 10;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 usage_p->ru_utime.tv_sec = user_usec / 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 usage_p->ru_utime.tv_usec = user_usec % 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 usage_p->ru_stime.tv_sec = kernel_usec / 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 usage_p->ru_stime.tv_usec = kernel_usec % 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 #else
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 /* Fill in the ru_utime and ru_stime members. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 struct tms time;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 if (times (&time) != (clock_t) -1)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 /* Number of clock ticks per second. */
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 unsigned int clocks_per_second = sysconf (_SC_CLK_TCK);
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 if (clocks_per_second > 0)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 clock_t user_ticks;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 clock_t system_ticks;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 uint64_t user_usec;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 uint64_t system_usec;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 if (who == RUSAGE_CHILDREN)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 user_ticks = time.tms_cutime;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 system_ticks = time.tms_cstime;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 else
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 user_ticks = time.tms_utime;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 system_ticks = time.tms_stime;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 user_usec =
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 (((uint64_t) user_ticks * (uint64_t) 1000000U)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 + clocks_per_second / 2) / clocks_per_second;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 system_usec =
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 (((uint64_t) system_ticks * (uint64_t) 1000000U)
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 + clocks_per_second / 2) / clocks_per_second;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 usage_p->ru_utime.tv_sec = user_usec / 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 usage_p->ru_utime.tv_usec = user_usec % 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 usage_p->ru_stime.tv_sec = system_usec / 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 usage_p->ru_stime.tv_usec = system_usec % 1000000U;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 #endif
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 return 0;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 else
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 {
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 errno = EINVAL;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 return -1;
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 }
30ef6011648b New module 'getrusage'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 }