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