1d540f44创建于 2021年9月23日历史提交
/* -------------------------------------------------------------------------
 *
 * pg_rusage.c
 *	  Resource usage measurement support routines.
 *
 *
 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/backend/utils/misc/pg_rusage.c
 *
 * -------------------------------------------------------------------------
 */
#include "postgres.h"
#include "knl/knl_variable.h"


#include "utils/pg_rusage.h"

/*
 * Initialize usage snapshot.
 */
void pg_rusage_init(PGRUsage* ru0)
{
    getrusage(RUSAGE_THREAD, &ru0->ru);
    gettimeofday(&ru0->tv, NULL);
}

/*
 * Compute elapsed time since ru0 usage snapshot, and format into
 * a displayable string.  Result is in a static string, which is
 * tacky, but no one ever claimed that the openGauss backend is
 * threadable...
 */
const char* pg_rusage_show(const PGRUsage* ru0)
{
    char* result = t_thrd.buf_cxt.pg_rusage_show_buf;
    int size = sizeof(t_thrd.buf_cxt.pg_rusage_show_buf);
    PGRUsage ru1;
    int nRet = 0;

    pg_rusage_init(&ru1);

    if (ru1.tv.tv_usec < ru0->tv.tv_usec) {
        ru1.tv.tv_sec--;
        ru1.tv.tv_usec += 1000000;
    }
    if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec) {
        ru1.ru.ru_stime.tv_sec--;
        ru1.ru.ru_stime.tv_usec += 1000000;
    }
    if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec) {
        ru1.ru.ru_utime.tv_sec--;
        ru1.ru.ru_utime.tv_usec += 1000000;
    }

    nRet = snprintf_s(result,
        size,
        size - 1,
        "CPU %d.%02ds/%d.%02du sec elapsed %d.%02d sec",
        (int)(ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec),
        (int)(ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000,
        (int)(ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec),
        (int)(ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000,
        (int)(ru1.tv.tv_sec - ru0->tv.tv_sec),
        (int)(ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000);
    securec_check_ss_c(nRet, "\0", "\0");
    return result;
}