agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH 2/5] pg_ctl: Add tests for promote action 270+ messages / 2 participants [nested] [flat]
* [PATCH 2/5] pg_ctl: Add tests for promote action @ 2016-07-26 14:48 Peter Eisentraut <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Peter Eisentraut @ 2016-07-26 14:48 UTC (permalink / raw) --- src/bin/pg_ctl/t/003_promote.pl | 41 +++++++++++++++++++++++++++++++++++++++++ src/test/perl/TestLib.pm | 11 +++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/bin/pg_ctl/t/003_promote.pl diff --git a/src/bin/pg_ctl/t/003_promote.pl b/src/bin/pg_ctl/t/003_promote.pl new file mode 100644 index 0000000..d7e7b99 --- /dev/null +++ b/src/bin/pg_ctl/t/003_promote.pl @@ -0,0 +1,41 @@ +use strict; +use warnings; + +use PostgresNode; +use TestLib; +use Test::More tests => 9; + +my $tempdir = TestLib::tempdir; + +command_fails_like([ 'pg_ctl', 'promote', '-D', "$tempdir/nonexistent" ], + qr/directory .* does not exist/, + 'pg_ctl promote with nonexistent directory'); + +my $node_primary = get_new_node('primary'); +$node_primary->init(allows_streaming => 1); + +command_fails_like([ 'pg_ctl', 'promote', '-D', $node_primary->data_dir ], + qr/PID file .* does not exist/, + 'pg_ctl promote of not running instance fails'); + +$node_primary->start; + +command_fails_like([ 'pg_ctl', 'promote', '-D', $node_primary->data_dir ], + qr/not in standby mode/, + 'pg_ctl promote of primary instance fails'); + +my $node_standby = get_new_node('standby'); +$node_primary->backup('my_backup'); +$node_standby->init_from_backup($node_primary, 'my_backup', has_streaming => 1); +$node_standby->start; + +is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'), + 't', 'standby is in recovery'); + +command_ok([ 'pg_ctl', 'promote', '-D', $node_standby->data_dir ], + 'pg_ctl promote of standby runs'); + +$node_standby->poll_query_until('postgres', 'SELECT NOT pg_is_in_recovery()'); + +is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'), + 'f', 'promoted standby is not in recovery'); diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index c7b3262..51b533e 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -34,6 +34,7 @@ our @EXPORT = qw( program_version_ok program_options_handling_ok command_like + command_fails_like $windows_os ); @@ -281,4 +282,14 @@ sub command_like like($stdout, $expected_stdout, "$test_name: matches"); } +sub command_fails_like +{ + my ($cmd, $expected_stderr, $test_name) = @_; + my ($stdout, $stderr); + print("# Running: " . join(" ", @{$cmd}) . "\n"); + my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + ok(!$result, "$test_name: exit code not 0"); + like($stderr, $expected_stderr, "$test_name: matches"); +} + 1; -- 2.9.2 --------------078DFD7E5090B3A6C622472C Content-Type: text/x-patch; name="0003-pg_ctl-Detect-current-standby-state-from-pg_control.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0003-pg_ctl-Detect-current-standby-state-from-pg_control.pat"; filename*1="ch" ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 270+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 270+ messages in thread
end of thread, other threads:[~2023-01-21 00:09 UTC | newest] Thread overview: 270+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2016-07-26 14:48 [PATCH 2/5] pg_ctl: Add tests for promote action Peter Eisentraut <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox