Coverage Report

Created: 2025-06-13 06:06

/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
}