Branch data Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * pg_rusage.c
4 : : * Resource usage measurement support routines.
5 : : *
6 : : *
7 : : * Portions Copyright (c) 1996-2026, 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 : 740 : pg_rusage_init(PGRUsage *ru0)
28 : : {
29 : 740 : getrusage(RUSAGE_SELF, &ru0->ru);
30 : 740 : gettimeofday(&ru0->tv, NULL);
31 : 740 : }
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 : 1 : pg_rusage_show(const PGRUsage *ru0)
41 : : {
42 : : static char result[100];
43 : 1 : PGRUsage ru1;
44 : :
45 : 1 : pg_rusage_init(&ru1);
46 : :
47 [ + - ]: 1 : if (ru1.tv.tv_usec < ru0->tv.tv_usec)
48 : : {
49 : 0 : ru1.tv.tv_sec--;
50 : 0 : ru1.tv.tv_usec += 1000000;
51 : 0 : }
52 [ + - ]: 1 : if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec)
53 : : {
54 : 0 : ru1.ru.ru_stime.tv_sec--;
55 : 0 : ru1.ru.ru_stime.tv_usec += 1000000;
56 : 0 : }
57 [ + - ]: 1 : if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec)
58 : : {
59 : 0 : ru1.ru.ru_utime.tv_sec--;
60 : 0 : ru1.ru.ru_utime.tv_usec += 1000000;
61 : 0 : }
62 : :
63 : 1 : snprintf(result, sizeof(result),
64 : 1 : _("CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s"),
65 : 1 : (int) (ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec),
66 : 1 : (int) (ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000,
67 : 1 : (int) (ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec),
68 : 1 : (int) (ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000,
69 : 1 : (int) (ru1.tv.tv_sec - ru0->tv.tv_sec),
70 : 1 : (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000);
71 : :
72 : 1 : return result;
73 : 1 : }
|