/src/postgres/src/backend/utils/misc/pg_rusage.c
Line | Count | Source (jump to first uncovered line) |
1 | | /*------------------------------------------------------------------------- |
2 | | * |
3 | | * pg_rusage.c |
4 | | * Resource usage measurement support routines. |
5 | | * |
6 | | * |
7 | | * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group |
8 | | * Portions Copyright (c) 1994, Regents of the University of California |
9 | | * |
10 | | * |
11 | | * IDENTIFICATION |
12 | | * src/backend/utils/misc/pg_rusage.c |
13 | | * |
14 | | *------------------------------------------------------------------------- |
15 | | */ |
16 | | #include "postgres.h" |
17 | | |
18 | | #include <unistd.h> |
19 | | |
20 | | #include "utils/pg_rusage.h" |
21 | | |
22 | | |
23 | | /* |
24 | | * Initialize usage snapshot. |
25 | | */ |
26 | | void |
27 | | pg_rusage_init(PGRUsage *ru0) |
28 | 0 | { |
29 | 0 | getrusage(RUSAGE_SELF, &ru0->ru); |
30 | 0 | gettimeofday(&ru0->tv, NULL); |
31 | 0 | } |
32 | | |
33 | | /* |
34 | | * Compute elapsed time since ru0 usage snapshot, and format into |
35 | | * a displayable string. Result is in a static string, which is |
36 | | * tacky, but no one ever claimed that the Postgres backend is |
37 | | * threadable... |
38 | | */ |
39 | | const char * |
40 | | pg_rusage_show(const PGRUsage *ru0) |
41 | 0 | { |
42 | 0 | static char result[100]; |
43 | 0 | PGRUsage ru1; |
44 | |
|
45 | 0 | pg_rusage_init(&ru1); |
46 | |
|
47 | 0 | if (ru1.tv.tv_usec < ru0->tv.tv_usec) |
48 | 0 | { |
49 | 0 | ru1.tv.tv_sec--; |
50 | 0 | ru1.tv.tv_usec += 1000000; |
51 | 0 | } |
52 | 0 | if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec) |
53 | 0 | { |
54 | 0 | ru1.ru.ru_stime.tv_sec--; |
55 | 0 | ru1.ru.ru_stime.tv_usec += 1000000; |
56 | 0 | } |
57 | 0 | if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec) |
58 | 0 | { |
59 | 0 | ru1.ru.ru_utime.tv_sec--; |
60 | 0 | ru1.ru.ru_utime.tv_usec += 1000000; |
61 | 0 | } |
62 | |
|
63 | 0 | snprintf(result, sizeof(result), |
64 | 0 | _("CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s"), |
65 | 0 | (int) (ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec), |
66 | 0 | (int) (ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000, |
67 | 0 | (int) (ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec), |
68 | 0 | (int) (ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000, |
69 | 0 | (int) (ru1.tv.tv_sec - ru0->tv.tv_sec), |
70 | 0 | (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000); |
71 | |
|
72 | 0 | return result; |
73 | 0 | } |